sfc_kvarg_long_handler() only checked that strtol() consumed at least one
character, so trailing garbage such as "5abc" was accepted, and errno was
never checked, so an out of range value was silently taken as LONG_MAX or
LONG_MIN.

It did nothing beyond that conversion, so drop it and use the new
rte_kvargs_handle_long(). The callers keep their long variables and their
own range checks.

Signed-off-by: Stephen Hemminger <[email protected]>
---
 drivers/net/sfc/sfc.c        |  2 +-
 drivers/net/sfc/sfc_kvargs.c | 19 -------------------
 drivers/net/sfc/sfc_kvargs.h |  2 --
 drivers/net/sfc/sfc_port.c   |  2 +-
 4 files changed, 2 insertions(+), 23 deletions(-)

diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 39cd8d519a..3d460cc222 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -1213,7 +1213,7 @@ sfc_kvarg_rxd_wait_timeout_ns(struct sfc_adapter *sa)
        value = SFC_RXD_WAIT_TIMEOUT_NS_DEF;
 
        rc = sfc_kvargs_process(sa, SFC_KVARG_RXD_WAIT_TIMEOUT_NS,
-                               sfc_kvarg_long_handler, &value);
+                               rte_kvargs_handle_long, &value);
        if (rc != 0)
                return rc;
 
diff --git a/drivers/net/sfc/sfc_kvargs.c b/drivers/net/sfc/sfc_kvargs.c
index eb36fa98ca..d67f822dd2 100644
--- a/drivers/net/sfc/sfc_kvargs.c
+++ b/drivers/net/sfc/sfc_kvargs.c
@@ -107,25 +107,6 @@ sfc_kvarg_bool_handler(__rte_unused const char *key,
        return 0;
 }
 
-int
-sfc_kvarg_long_handler(__rte_unused const char *key,
-                      const char *value_str, void *opaque)
-{
-       long value;
-       char *endptr;
-
-       if (!opaque)
-               return -EINVAL;
-
-       value = strtol(value_str, &endptr, 0);
-       if (endptr == value_str)
-               return -EINVAL;
-
-       *(long *)opaque = value;
-
-       return 0;
-}
-
 int
 sfc_kvarg_string_handler(__rte_unused const char *key,
                         const char *value_str, void *opaque)
diff --git a/drivers/net/sfc/sfc_kvargs.h b/drivers/net/sfc/sfc_kvargs.h
index 4dcc61e973..99de772d2d 100644
--- a/drivers/net/sfc/sfc_kvargs.h
+++ b/drivers/net/sfc/sfc_kvargs.h
@@ -88,8 +88,6 @@ int sfc_kvargs_process_opt(struct sfc_adapter *sa, const char 
*key_match,
 
 int sfc_kvarg_bool_handler(const char *key, const char *value_str,
                           void *opaque);
-int sfc_kvarg_long_handler(const char *key, const char *value_str,
-                          void *opaque);
 int sfc_kvarg_string_handler(const char *key, const char *value_str,
                             void *opaque);
 
diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
index 33b53f7ac8..d0652b612b 100644
--- a/drivers/net/sfc/sfc_port.c
+++ b/drivers/net/sfc/sfc_port.c
@@ -488,7 +488,7 @@ sfc_port_attach(struct sfc_adapter *sa)
        kvarg_stats_update_period_ms = SFC_MAC_STATS_UPDATE_PERIOD_MS_DEF;
 
        rc = sfc_kvargs_process(sa, SFC_KVARG_STATS_UPDATE_PERIOD_MS,
-                               sfc_kvarg_long_handler,
+                               rte_kvargs_handle_long,
                                &kvarg_stats_update_period_ms);
        if ((rc == 0) &&
            ((kvarg_stats_update_period_ms < 0) ||
-- 
2.53.0

Reply via email to