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

