The eventdev rx adapter code was using atoi() to parse numeric
parameters which does not handle out-of-range or extra garbage
on input. Tighten the code to only accept valid numbers.

Fixes: 814d01709328 ("eventdev/eth_rx: support telemetry")
Cc: [email protected]

Signed-off-by: Stephen Hemminger <[email protected]>
---
 lib/eventdev/rte_event_eth_rx_adapter.c | 45 +++++++++++--------------
 1 file changed, 19 insertions(+), 26 deletions(-)

diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c 
b/lib/eventdev/rte_event_eth_rx_adapter.c
index 96a4a0d926..635bd6014b 100644
--- a/lib/eventdev/rte_event_eth_rx_adapter.c
+++ b/lib/eventdev/rte_event_eth_rx_adapter.c
@@ -270,8 +270,8 @@ rxa_timestamp_dynfield(struct rte_mbuf *mbuf)
                event_eth_rx_timestamp_dynfield_offset, rte_mbuf_timestamp_t *);
 }
 
-static inline int
-rxa_validate_id(uint8_t id)
+static inline bool
+rxa_validate_id(unsigned long id)
 {
        return id < RTE_EVENT_ETH_RX_ADAPTER_MAX_INSTANCE;
 }
@@ -294,14 +294,14 @@ rxa_event_buf_get(struct event_eth_rx_adapter 
*rx_adapter, uint16_t eth_dev_id,
 
 #define RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, retval) do { \
        if (!rxa_validate_id(id)) { \
-               RTE_EDEV_LOG_ERR("Invalid eth Rx adapter id = %d", id); \
+               RTE_EDEV_LOG_ERR("Invalid eth Rx adapter id = %lu", (unsigned 
long)id); \
                return retval; \
        } \
 } while (0)
 
 #define RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_GOTO_ERR_RET(id, retval) do { \
        if (!rxa_validate_id(id)) { \
-               RTE_EDEV_LOG_ERR("Invalid eth Rx adapter id = %d", id); \
+               RTE_EDEV_LOG_ERR("Invalid eth Rx adapter id = %lu", (unsigned 
long)id); \
                ret = retval; \
                goto error; \
        } \
@@ -316,8 +316,8 @@ rxa_event_buf_get(struct event_eth_rx_adapter *rx_adapter, 
uint16_t eth_dev_id,
 } while (0)
 
 #define RTE_EVENT_ETH_RX_ADAPTER_PORTID_VALID_OR_GOTO_ERR_RET(port_id, retval) 
do { \
-       if (!rte_eth_dev_is_valid_port(port_id)) { \
-               RTE_EDEV_LOG_ERR("Invalid port_id=%u", port_id); \
+       if (port_id >= RTE_MAX_ETHPORTS || !rte_eth_dev_is_valid_port(port_id)) 
{ \
+               RTE_EDEV_LOG_ERR("Invalid port_id=%lu", (unsigned 
long)port_id); \
                ret = retval; \
                goto error; \
        } \
@@ -3761,14 +3761,14 @@ handle_rxa_stats(const char *cmd __rte_unused,
                 const char *params,
                 struct rte_tel_data *d)
 {
-       uint8_t rx_adapter_id;
+       unsigned long rx_adapter_id;
        struct rte_event_eth_rx_adapter_stats rx_adptr_stats;
 
        if (params == NULL || strlen(params) == 0 || !isdigit((unsigned 
char)*params))
                return -1;
 
        /* Get Rx adapter ID from parameter string */
-       rx_adapter_id = atoi(params);
+       rx_adapter_id = strtoul(params, NULL, 10);
        RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(rx_adapter_id, -EINVAL);
 
        /* Get Rx adapter stats */
@@ -3802,13 +3802,13 @@ handle_rxa_stats_reset(const char *cmd __rte_unused,
                       const char *params,
                       struct rte_tel_data *d __rte_unused)
 {
-       uint8_t rx_adapter_id;
+       unsigned long rx_adapter_id;
 
        if (params == NULL || strlen(params) == 0 || !isdigit((unsigned 
char)*params))
                return -1;
 
        /* Get Rx adapter ID from parameter string */
-       rx_adapter_id = atoi(params);
+       rx_adapter_id = strtoul(params, NULL, 10);
        RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(rx_adapter_id, -EINVAL);
 
        /* Reset Rx adapter stats */
@@ -3825,9 +3825,7 @@ handle_rxa_get_queue_conf(const char *cmd __rte_unused,
                          const char *params,
                          struct rte_tel_data *d)
 {
-       uint8_t rx_adapter_id;
-       uint16_t rx_queue_id;
-       uint16_t eth_dev_id;
+       unsigned long rx_adapter_id, rx_queue_id, eth_dev_id;
        int ret = -1;
        char *token, *l_params, *saveptr = NULL;
        struct rte_event_eth_rx_adapter_queue_conf queue_conf;
@@ -3857,7 +3855,7 @@ handle_rxa_get_queue_conf(const char *cmd __rte_unused,
        /* Get Rx queue ID from parameter string */
        rx_queue_id = strtoul(token, NULL, 10);
        if (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) {
-               RTE_EDEV_LOG_ERR("Invalid rx queue_id %u", rx_queue_id);
+               RTE_EDEV_LOG_ERR("Invalid rx queue_id %lu", rx_queue_id);
                ret = -EINVAL;
                goto error;
        }
@@ -3898,9 +3896,7 @@ handle_rxa_get_queue_stats(const char *cmd __rte_unused,
                           const char *params,
                           struct rte_tel_data *d)
 {
-       uint8_t rx_adapter_id;
-       uint16_t rx_queue_id;
-       uint16_t eth_dev_id;
+       unsigned long rx_adapter_id, rx_queue_id, eth_dev_id;
        int ret = -1;
        char *token, *l_params, *saveptr = NULL;
        struct rte_event_eth_rx_adapter_queue_stats q_stats;
@@ -3930,7 +3926,7 @@ handle_rxa_get_queue_stats(const char *cmd __rte_unused,
        /* Get Rx queue ID from parameter string */
        rx_queue_id = strtoul(token, NULL, 10);
        if (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) {
-               RTE_EDEV_LOG_ERR("Invalid rx queue_id %u", rx_queue_id);
+               RTE_EDEV_LOG_ERR("Invalid rx queue_id %lu", rx_queue_id);
                ret = -EINVAL;
                goto error;
        }
@@ -3970,9 +3966,7 @@ handle_rxa_queue_stats_reset(const char *cmd __rte_unused,
                             const char *params,
                             struct rte_tel_data *d __rte_unused)
 {
-       uint8_t rx_adapter_id;
-       uint16_t rx_queue_id;
-       uint16_t eth_dev_id;
+       unsigned long rx_adapter_id, rx_queue_id, eth_dev_id;
        int ret = -1;
        char *token, *l_params, *saveptr = NULL;
 
@@ -4001,7 +3995,7 @@ handle_rxa_queue_stats_reset(const char *cmd __rte_unused,
        /* Get Rx queue ID from parameter string */
        rx_queue_id = strtoul(token, NULL, 10);
        if (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) {
-               RTE_EDEV_LOG_ERR("Invalid rx queue_id %u", rx_queue_id);
+               RTE_EDEV_LOG_ERR("Invalid rx queue_id %lu", rx_queue_id);
                ret = -EINVAL;
                goto error;
        }
@@ -4033,8 +4027,7 @@ handle_rxa_instance_get(const char *cmd __rte_unused,
                        struct rte_tel_data *d)
 {
        uint8_t instance_id;
-       uint16_t rx_queue_id;
-       uint16_t eth_dev_id;
+       unsigned long rx_queue_id, eth_dev_id;
        int ret = -1;
        char *token, *l_params, *saveptr = NULL;
 
@@ -4057,7 +4050,7 @@ handle_rxa_instance_get(const char *cmd __rte_unused,
        /* Get Rx queue ID from parameter string */
        rx_queue_id = strtoul(token, NULL, 10);
        if (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) {
-               RTE_EDEV_LOG_ERR("Invalid rx queue_id %u", rx_queue_id);
+               RTE_EDEV_LOG_ERR("Invalid rx queue_id %lu", rx_queue_id);
                ret = -EINVAL;
                goto error;
        }
@@ -4074,7 +4067,7 @@ handle_rxa_instance_get(const char *cmd __rte_unused,
                                                  rx_queue_id,
                                                  &instance_id)) {
                RTE_EDEV_LOG_ERR("Failed to get RX adapter instance ID "
-                                " for rx_queue_id = %d", rx_queue_id);
+                                " for rx_queue_id = %lu", rx_queue_id);
                return -1;
        }
 
-- 
2.53.0

Reply via email to