The lcore argument is converted with atoi(), which validates nothing:
a malformed value such as "abc" becomes zero, and the range check that
follows only catches a value which happens to land outside it.

Use rte_kvargs_to_int() with the lcore range, and log the key and the
range when it does not fit.

The parsing function returns void and probe does not fail on a bad
argument, which is left alone here: an unusable lcore still falls back
to the default. Only the "Parse lcore_id" message is now skipped when
the conversion failed, since it reported a value which had not been
parsed at all.

Signed-off-by: Stephen Hemminger <[email protected]>
---
 drivers/dma/skeleton/skeleton_dmadev.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/drivers/dma/skeleton/skeleton_dmadev.c 
b/drivers/dma/skeleton/skeleton_dmadev.c
index e287802eb9..44158d5a7f 100644
--- a/drivers/dma/skeleton/skeleton_dmadev.c
+++ b/drivers/dma/skeleton/skeleton_dmadev.c
@@ -638,19 +638,24 @@ skeldma_destroy(const char *name)
 }
 
 static int
-skeldma_parse_lcore(const char *key __rte_unused,
+skeldma_parse_lcore(const char *key,
                    const char *value,
                    void *opaque)
 {
-       int lcore_id;
+       int64_t lcore_id;
+       int ret;
 
-       if (value == NULL || opaque == NULL)
+       if (opaque == NULL)
                return -EINVAL;
 
-       lcore_id = atoi(value);
-       if (lcore_id >= 0 && lcore_id < RTE_MAX_LCORE)
-               *(int *)opaque = lcore_id;
+       ret = rte_kvargs_to_int(value, 0, RTE_MAX_LCORE - 1, &lcore_id);
+       if (ret < 0) {
+               SKELDMA_LOG(ERR, "Invalid %s, must be 0..%u", key,
+                           RTE_MAX_LCORE - 1);
+               return ret;
+       }
 
+       *(int *)opaque = lcore_id;
        return 0;
 }
 
@@ -673,9 +678,9 @@ skeldma_parse_vdev_args(struct rte_vdev_device *vdev, int 
*lcore_id)
        if (!kvlist)
                return;
 
-       (void)rte_kvargs_process(kvlist, SKELDMA_ARG_LCORE,
-                                skeldma_parse_lcore, lcore_id);
-       SKELDMA_LOG(INFO, "Parse lcore_id = %d", *lcore_id);
+       if (rte_kvargs_process(kvlist, SKELDMA_ARG_LCORE,
+                              skeldma_parse_lcore, lcore_id) == 0)
+               SKELDMA_LOG(INFO, "Parse lcore_id = %d", *lcore_id);
 
        rte_kvargs_free(kvlist);
 }
-- 
2.53.0

Reply via email to