The mode, socket id and time_ms parsers all assign the strtol() result
before checking the end pointer and errno, and the mode parser truncates
into a uint8_t so "mode=257" aliases onto mode 1.

parse_port_id() has the same unchecked pattern, and did not bound the
result before using it, relying on rte_eth_dev_is_valid_port() to catch
out of range values.

The socket id parser cast to int8_t when testing for SOCKET_ID_ANY, so
any value whose low byte is 0xff, such as 255 or -257, was accepted as
SOCKET_ID_ANY.

Drop the stray errno reset in the agg mode parser, which only does
string comparisons.

Signed-off-by: Stephen Hemminger <[email protected]>
---
 drivers/net/bonding/eth_bond_private.h  |  8 ---
 drivers/net/bonding/rte_eth_bond_args.c | 71 ++++---------------------
 drivers/net/bonding/rte_eth_bond_pmd.c  |  8 +--
 3 files changed, 14 insertions(+), 73 deletions(-)

diff --git a/drivers/net/bonding/eth_bond_private.h 
b/drivers/net/bonding/eth_bond_private.h
index 378bbba4e6..9a2fb7167e 100644
--- a/drivers/net/bonding/eth_bond_private.h
+++ b/drivers/net/bonding/eth_bond_private.h
@@ -298,10 +298,6 @@ int
 bond_ethdev_parse_member_agg_mode_kvarg(const char *key __rte_unused,
                const char *value, void *extra_args);
 
-int
-bond_ethdev_parse_socket_id_kvarg(const char *key,
-               const char *value, void *extra_args);
-
 int
 bond_ethdev_parse_primary_member_port_id_kvarg(const char *key,
                const char *value, void *extra_args);
@@ -314,10 +310,6 @@ int
 bond_ethdev_parse_bond_mac_addr_kvarg(const char *key,
                const char *value, void *extra_args);
 
-int
-bond_ethdev_parse_time_ms_kvarg(const char *key,
-               const char *value, void *extra_args);
-
 void
 bond_tlb_disable(struct bond_dev_private *internals);
 
diff --git a/drivers/net/bonding/rte_eth_bond_args.c 
b/drivers/net/bonding/rte_eth_bond_args.c
index 823ed80f07..25602b3b47 100644
--- a/drivers/net/bonding/rte_eth_bond_args.c
+++ b/drivers/net/bonding/rte_eth_bond_args.c
@@ -91,13 +91,13 @@ parse_port_id(const char *port_str)
                /* try parsing as device name, virtual devices */
                port_id = find_port_id_by_dev_name(port_str);
                if (port_id < 0) {
-                       char *end;
-                       errno = 0;
+                       uint64_t val;
 
                        /* try parsing as port id */
-                       port_id = strtol(port_str, &end, 10);
-                       if (*end != 0 || errno != 0)
+                       if (rte_kvargs_to_uint(port_str, 0, RTE_MAX_ETHPORTS - 
1, &val) < 0)
                                return -1;
+
+                       port_id = val;
                }
        }
 
@@ -136,19 +136,17 @@ int
 bond_ethdev_parse_member_mode_kvarg(const char *key __rte_unused,
                const char *value, void *extra_args)
 {
-       uint8_t *mode;
-       char *endptr;
+       uint8_t *mode = extra_args;
+       uint64_t val;
 
-       if (value == NULL || extra_args == NULL)
+       if (extra_args == NULL)
                return -1;
 
-       mode = extra_args;
-
-       errno = 0;
-       *mode = strtol(value, &endptr, 10);
-       if (*endptr != 0 || errno != 0)
+       if (rte_kvargs_to_uint(value, 0, UINT8_MAX, &val) < 0)
                return -1;
 
+       *mode = val;
+
        /* validate mode value */
        switch (*mode) {
        case BONDING_MODE_ROUND_ROBIN:
@@ -176,7 +174,6 @@ bond_ethdev_parse_member_agg_mode_kvarg(const char *key 
__rte_unused,
 
        agg_mode = extra_args;
 
-       errno = 0;
        if (strncmp(value, "stable", 6) == 0)
                *agg_mode = AGG_STABLE;
 
@@ -197,35 +194,6 @@ bond_ethdev_parse_member_agg_mode_kvarg(const char *key 
__rte_unused,
        }
 }
 
-int
-bond_ethdev_parse_socket_id_kvarg(const char *key __rte_unused,
-               const char *value, void *extra_args)
-{
-       long socket_id;
-       char *endptr;
-
-       if (value == NULL || extra_args == NULL)
-               return -1;
-
-       errno = 0;
-       socket_id = strtol(value, &endptr, 10);
-       if (*endptr != 0 || errno != 0)
-               return -1;
-
-       /* SOCKET_ID_ANY also consider a valid socket id */
-       if ((int8_t)socket_id == SOCKET_ID_ANY) {
-               *(int *)extra_args = SOCKET_ID_ANY;
-               return 0;
-       }
-
-       /* validate socket id value */
-       if (socket_id >= 0 && socket_id < RTE_MAX_NUMA_NODES) {
-               *(int *)extra_args = (int)socket_id;
-               return 0;
-       }
-       return -1;
-}
-
 int
 bond_ethdev_parse_primary_member_port_id_kvarg(const char *key __rte_unused,
                const char *value, void *extra_args)
@@ -278,22 +246,3 @@ bond_ethdev_parse_bond_mac_addr_kvarg(const char *key 
__rte_unused,
        return rte_ether_unformat_addr(value, extra_args);
 }
 
-int
-bond_ethdev_parse_time_ms_kvarg(const char *key __rte_unused,
-               const char *value, void *extra_args)
-{
-       uint32_t time_ms;
-       char *endptr;
-
-       if (value == NULL || extra_args == NULL)
-               return -1;
-
-       errno = 0;
-       time_ms = (uint32_t)strtol(value, &endptr, 10);
-       if (*endptr != 0 || errno != 0)
-               return -1;
-
-       *(uint32_t *)extra_args = time_ms;
-
-       return 0;
-}
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c 
b/drivers/net/bonding/rte_eth_bond_pmd.c
index 6a4f997b5a..766dfd9459 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -3869,7 +3869,7 @@ bond_probe(struct rte_vdev_device *dev)
        arg_count = rte_kvargs_count(kvlist, PMD_BOND_SOCKET_ID_KVARG);
        if (arg_count == 1) {
                if (rte_kvargs_process(kvlist, PMD_BOND_SOCKET_ID_KVARG,
-                               &bond_ethdev_parse_socket_id_kvarg, &socket_id)
+                               rte_kvargs_handle_socket_id, &socket_id)
                                != 0) {
                        RTE_BOND_LOG(ERR, "Invalid socket Id specified for "
                                        "bonding device %s", name);
@@ -4207,7 +4207,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 
                if (rte_kvargs_process(kvlist,
                                       PMD_BOND_LSC_POLL_PERIOD_KVARG,
-                                      &bond_ethdev_parse_time_ms_kvarg,
+                                      rte_kvargs_handle_u32,
                                       &lsc_poll_interval_ms) < 0) {
                        RTE_BOND_LOG(INFO,
                                     "Invalid lsc polling interval value 
specified for bonding"
@@ -4236,7 +4236,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 
                if (rte_kvargs_process(kvlist,
                                       PMD_BOND_LINK_UP_PROP_DELAY_KVARG,
-                                      &bond_ethdev_parse_time_ms_kvarg,
+                                      rte_kvargs_handle_u32,
                                       &link_up_delay_ms) < 0) {
                        RTE_BOND_LOG(INFO,
                                     "Invalid link up propagation delay value 
specified for"
@@ -4266,7 +4266,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 
                if (rte_kvargs_process(kvlist,
                                       PMD_BOND_LINK_DOWN_PROP_DELAY_KVARG,
-                                      &bond_ethdev_parse_time_ms_kvarg,
+                                      rte_kvargs_handle_u32,
                                       &link_down_delay_ms) < 0) {
                        RTE_BOND_LOG(INFO,
                                     "Invalid link down propagation delay value 
specified for"
-- 
2.53.0

Reply via email to