The VSI timeout and delay arguments are parsed with strtoul() without checking the end pointer, so a value such as "10abc" is accepted. They are also assigned into a uint32_t before being validated, so a value above UINT32_MAX is truncated and only rejected if it happens to truncate to zero.
Report the offending string rather than the truncated value, which was not meaningful once the conversion had failed. Signed-off-by: Stephen Hemminger <[email protected]> --- drivers/net/enetc/enetc4_vf.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/net/enetc/enetc4_vf.c b/drivers/net/enetc/enetc4_vf.c index ef5f1e6d66..18bbffc255 100644 --- a/drivers/net/enetc/enetc4_vf.c +++ b/drivers/net/enetc/enetc4_vf.c @@ -1359,28 +1359,30 @@ enetc4_vf_dev_init(struct rte_eth_dev *eth_dev) /* parse optional VSI-PSI timeout devarg */ val = rte_kvargs_get(kvlist, ENETC4_VSI_TIMEOUT); if (val) { - errno = 0; - hw->vsi_timeout = (uint32_t)strtoul(val, NULL, 0); - if (errno != 0 || hw->vsi_timeout == 0) { - ENETC_PMD_ERR("Invalid VSI Timeout value = %u", - hw->vsi_timeout); + uint64_t num; + + if (rte_kvargs_to_uint(val, 1, UINT32_MAX, &num) < 0) { + ENETC_PMD_ERR("Invalid VSI Timeout value = %s", + val); rte_kvargs_free(kvlist); return -1; } + hw->vsi_timeout = num; ENETC_PMD_NOTICE("VSI timeout set to %u", hw->vsi_timeout); } /* parse optional VSI-PSI delay devarg */ val = rte_kvargs_get(kvlist, ENETC4_VSI_DELAY); if (val) { - errno = 0; - hw->vsi_delay = (uint32_t)strtoul(val, NULL, 0); - if (errno != 0 || hw->vsi_delay == 0) { - ENETC_PMD_ERR("Invalid VSI Delay value = %u", - hw->vsi_delay); + uint64_t num; + + if (rte_kvargs_to_uint(val, 1, UINT32_MAX, &num) < 0) { + ENETC_PMD_ERR("Invalid VSI Delay value = %s", + val); rte_kvargs_free(kvlist); return -1; } + hw->vsi_delay = num; ENETC_PMD_NOTICE("VSI delay set to %u us", hw->vsi_delay); } -- 2.53.0

