The rte_kvargs_process() was used to parse KV pairs, it also supports
to parse 'only keys' (e.g. socket_id) type. And the callback function
parameter 'value' is NULL when parsed 'only keys'.

This patch fixes segment fault when parse input args with 'only keys'.

Fixes: 79f2248219c0 ("net/i40e: add floating VEB option")
Fixes: cfdfca493cae ("net/i40e: fix multiple driver support")
Fixes: 56270b4208ab ("net/i40e: limit the number of VF messages")
Fixes: ee653bd80044 ("net/i40e: determine number of queues per VF at run time")
Cc: sta...@dpdk.org

Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>
---
 drivers/net/i40e/i40e_ethdev.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 371f42233e..1338b9b92d 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -829,6 +829,9 @@ floating_veb_list_handler(__rte_unused const char *key,
        int min, max;
        bool *vf_floating_veb = opaque;
 
+       if (floating_veb_value == NULL)
+               return -EINVAL;
+
        while (isblank(*floating_veb_value))
                floating_veb_value++;
 
@@ -921,6 +924,9 @@ i40e_check_floating_handler(__rte_unused const char *key,
                            const char *value,
                            __rte_unused void *opaque)
 {
+       if (value == NULL)
+               return -EINVAL;
+
        if (strcmp(value, "1"))
                return -1;
 
@@ -1258,6 +1264,9 @@ i40e_parse_multi_drv_handler(__rte_unused const char *key,
 
        pf = (struct i40e_pf *)opaque;
 
+       if (value == NULL)
+               return -EINVAL;
+
        errno = 0;
        support_multi_driver = strtoul(value, &end, 10);
        if (errno != 0 || end == value || *end != 0) {
@@ -1347,6 +1356,9 @@ read_vf_msg_config(__rte_unused const char *key,
 {
        struct i40e_vf_msg_cfg *cfg = opaque;
 
+       if (value == NULL)
+               return -EINVAL;
+
        if (sscanf(value, "%u@%u:%u", &cfg->max_msg, &cfg->period,
                        &cfg->ignore_second) != 3) {
                memset(cfg, 0, sizeof(*cfg));
@@ -4693,6 +4705,9 @@ static int i40e_pf_parse_vf_queue_number_handler(const 
char *key,
        pf = (struct i40e_pf *)opaque;
        RTE_SET_USED(key);
 
+       if (value == NULL)
+               return -EINVAL;
+
        errno = 0;
        num = strtoul(value, &end, 0);
        if (errno != 0 || end == value || *end != 0) {
-- 
2.17.1

Reply via email to