The size argument to the PMD can not be larger than the largest
per-mbuf data segment size; otherwise the logic in eth_null_rx()
would generate an invalid mbuf.

Fixes: 4df90194f2a2 ("net/null: prefer unsigned int")
Cc: [email protected]

Signed-off-by: Stephen Hemminger <[email protected]>
---
 doc/guides/rel_notes/release_26_03.rst | 2 ++
 drivers/net/null/rte_eth_null.c        | 9 ++++++---
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/doc/guides/rel_notes/release_26_03.rst 
b/doc/guides/rel_notes/release_26_03.rst
index e59d839164..04d2cfee8a 100644
--- a/doc/guides/rel_notes/release_26_03.rst
+++ b/doc/guides/rel_notes/release_26_03.rst
@@ -60,6 +60,8 @@ New Features
   * Changed info response to match mbuf limits.
   * Added validation that mbuf pool data size is large enough for
     packet size argument.
+  * Added check that packet size argument is not larger than largest
+    possible mbuf data segment.
 
 
 Removed Items
diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c
index 81001d9326..b5b83f1cf0 100644
--- a/drivers/net/null/rte_eth_null.c
+++ b/drivers/net/null/rte_eth_null.c
@@ -610,14 +610,17 @@ get_packet_size_arg(const char *key __rte_unused,
 {
        const char *a = value;
        unsigned int *packet_size = extra_args;
+       unsigned long sz;
 
        if ((value == NULL) || (extra_args == NULL))
                return -EINVAL;
 
-       *packet_size = (unsigned int)strtoul(a, NULL, 0);
-       if (*packet_size == UINT_MAX)
-               return -1;
+       errno = 0;
+       sz = strtoul(a, NULL, 0);
+       if (sz > UINT16_MAX || errno != 0)
+               return -EINVAL;
 
+       *packet_size = sz;
        return 0;
 }
 
-- 
2.51.0

Reply via email to