get_uint32() and get_uint16() check neither errno nor the end pointer,
so a malformed value is silently taken as zero and an out of range one
is truncated into the target.

The service cores argument is only ever tested for truth, so make it a
bool. It was declared int but written through a uint32_t pointer.

The boolean uses rte_kvargs_process_opt(), so that a bare key with no
value enables the option.

Signed-off-by: Stephen Hemminger <[email protected]>
---
 drivers/net/softnic/rte_eth_softnic.c         | 30 +++----------------
 .../net/softnic/rte_eth_softnic_internals.h   |  3 +-
 2 files changed, 6 insertions(+), 27 deletions(-)

diff --git a/drivers/net/softnic/rte_eth_softnic.c 
b/drivers/net/softnic/rte_eth_softnic.c
index 868e194509..81688d1dcf 100644
--- a/drivers/net/softnic/rte_eth_softnic.c
+++ b/drivers/net/softnic/rte_eth_softnic.c
@@ -344,28 +344,6 @@ get_string(const char *key __rte_unused, const char 
*value, void *extra_args)
        return 0;
 }
 
-static int
-get_uint32(const char *key __rte_unused, const char *value, void *extra_args)
-{
-       if (!value || !extra_args)
-               return -EINVAL;
-
-       *(uint32_t *)extra_args = strtoull(value, NULL, 0);
-
-       return 0;
-}
-
-static int
-get_uint16(const char *key __rte_unused, const char *value, void *extra_args)
-{
-       if (!value || !extra_args)
-               return -EINVAL;
-
-       *(uint16_t *)extra_args = strtoull(value, NULL, 0);
-
-       return 0;
-}
-
 static int
 pmd_parse_args(struct pmd_params *p, const char *params)
 {
@@ -412,7 +390,7 @@ pmd_parse_args(struct pmd_params *p, const char *params)
        /* Connection listening port (optional) */
        if (rte_kvargs_count(kvlist, PMD_PARAM_CONN_PORT) == 1) {
                ret = rte_kvargs_process(kvlist, PMD_PARAM_CONN_PORT,
-                       &get_uint16, &p->conn_port);
+                       rte_kvargs_handle_u16, &p->conn_port);
                if (ret < 0)
                        goto out_free;
        }
@@ -420,15 +398,15 @@ pmd_parse_args(struct pmd_params *p, const char *params)
        /* CPU ID (optional) */
        if (rte_kvargs_count(kvlist, PMD_PARAM_CPU_ID) == 1) {
                ret = rte_kvargs_process(kvlist, PMD_PARAM_CPU_ID,
-                       &get_uint32, &p->cpu_id);
+                       rte_kvargs_handle_u32, &p->cpu_id);
                if (ret < 0)
                        goto out_free;
        }
 
        /* Service cores (optional) */
        if (rte_kvargs_count(kvlist, PMD_PARAM_SC) == 1) {
-               ret = rte_kvargs_process(kvlist, PMD_PARAM_SC,
-                       &get_uint32, &p->sc);
+               ret = rte_kvargs_process_opt(kvlist, PMD_PARAM_SC,
+                       rte_kvargs_handle_bool, &p->sc);
                if (ret < 0)
                        goto out_free;
        }
diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h 
b/drivers/net/softnic/rte_eth_softnic_internals.h
index d3975dad10..a1f309afb1 100644
--- a/drivers/net/softnic/rte_eth_softnic_internals.h
+++ b/drivers/net/softnic/rte_eth_softnic_internals.h
@@ -5,6 +5,7 @@
 #ifndef __INCLUDE_RTE_ETH_SOFTNIC_INTERNALS_H__
 #define __INCLUDE_RTE_ETH_SOFTNIC_INTERNALS_H__
 
+#include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <sys/queue.h>
@@ -34,7 +35,7 @@ struct pmd_params {
        char firmware[SOFTNIC_PATH_MAX];
        uint16_t conn_port;
        uint32_t cpu_id;
-       int sc; /**< Service cores. */
+       bool sc; /**< Service cores. */
 };
 
 /**
-- 
2.53.0

Reply via email to