parse_u16_arg() never checked the end pointer, so a value such as "8junk" was accepted, and it used base 0, so a leading zero silently selected octal.
It was also used for both device arguments, but only queues_num is a uint16_t; socket_id is an int, so parsing it wrote two bytes into a four byte object and left the rest uninitialised. The handler did nothing beyond a range checked store, so drop it and pass rte_kvargs_handle_u16() and rte_kvargs_handle_socket_id() directly, each matching the width of the field it fills. The open coded range check only tested the upper bound, so a negative socket id such as -5 was accepted and used. The helper checks both ends, accepting -1, which is SOCKET_ID_ANY, through RTE_MAX_NUMA_NODES - 1, so the check is now redundant and is removed. Signed-off-by: Stephen Hemminger <[email protected]> --- .../baseband/turbo_sw/bbdev_turbo_software.c | 29 ++----------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/drivers/baseband/turbo_sw/bbdev_turbo_software.c b/drivers/baseband/turbo_sw/bbdev_turbo_software.c index 2cab495294..d6801d9123 100644 --- a/drivers/baseband/turbo_sw/bbdev_turbo_software.c +++ b/drivers/baseband/turbo_sw/bbdev_turbo_software.c @@ -1835,25 +1835,6 @@ dequeue_enc_ops(struct rte_bbdev_queue_data *q_data, return nb_dequeued; } -/* Parse 16bit integer from string argument */ -static inline int -parse_u16_arg(const char *key, const char *value, void *extra_args) -{ - uint16_t *u16 = extra_args; - unsigned int long result; - - if ((value == NULL) || (extra_args == NULL)) - return -EINVAL; - errno = 0; - result = strtoul(value, NULL, 0); - if ((result >= (1 << 16)) || (errno != 0)) { - rte_bbdev_log(ERR, "Invalid value %lu for %s", result, key); - return -ERANGE; - } - *u16 = (uint16_t)result; - return 0; -} - /* Parse parameters used to create device */ static int parse_turbo_sw_params(struct turbo_sw_params *params, const char *input_args) @@ -1869,20 +1850,14 @@ parse_turbo_sw_params(struct turbo_sw_params *params, const char *input_args) return -EFAULT; ret = rte_kvargs_process(kvlist, turbo_sw_valid_params[0], - &parse_u16_arg, ¶ms->queues_num); + rte_kvargs_handle_u16, ¶ms->queues_num); if (ret < 0) goto exit; ret = rte_kvargs_process(kvlist, turbo_sw_valid_params[1], - &parse_u16_arg, ¶ms->socket_id); + rte_kvargs_handle_socket_id, ¶ms->socket_id); if (ret < 0) goto exit; - - if (params->socket_id >= RTE_MAX_NUMA_NODES) { - rte_bbdev_log(ERR, "Invalid socket, must be < %u", - RTE_MAX_NUMA_NODES); - goto exit; - } } exit: -- 2.53.0

