]> git.droids-corp.org - dpdk.git/commitdiff
net/softnic: fix memory leak in arguments parsing
authorDapeng Yu <dapengx.yu@intel.com>
Thu, 15 Jul 2021 05:38:14 +0000 (13:38 +0800)
committerThomas Monjalon <thomas@monjalon.net>
Fri, 23 Jul 2021 08:09:23 +0000 (10:09 +0200)
In function pmd_parse_args(), firmware path is duplicated from device
arguments as character string, but is never freed, which cause memory
leak.

This patch changes the type of firmware member of struct pmd_params to
character array, to make memory resource release unnecessary, and
changes the type of name member to character array, to keep the
consistency of character string handling in struct pmd_params.

Fixes: 7e68bc20f8c8 ("net/softnic: restructure")
Cc: stable@dpdk.org
Signed-off-by: Dapeng Yu <dapengx.yu@intel.com>
Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>
drivers/net/softnic/rte_eth_softnic.c
drivers/net/softnic/rte_eth_softnic_internals.h

index f64023256db11dbdf114e32f3a90f6887b262747..0aa7147b13adfdecc9ae8ca7b9f3b2087e5a4c7a 100644 (file)
@@ -440,6 +440,7 @@ pmd_parse_args(struct pmd_params *p, const char *params)
 {
        struct rte_kvargs *kvlist;
        int ret = 0;
+       char *firmware = NULL;
 
        kvlist = rte_kvargs_parse(params, pmd_valid_args);
        if (kvlist == NULL)
@@ -447,7 +448,14 @@ pmd_parse_args(struct pmd_params *p, const char *params)
 
        /* Set default values */
        memset(p, 0, sizeof(*p));
-       p->firmware = SOFTNIC_FIRMWARE;
+       if (rte_strscpy(p->firmware, SOFTNIC_FIRMWARE,
+                       sizeof(p->firmware)) < 0) {
+               PMD_LOG(WARNING,
+                       "\"%s\": firmware path should be shorter than %zu",
+                       SOFTNIC_FIRMWARE, sizeof(p->firmware));
+               ret = -EINVAL;
+               goto out_free;
+       }
        p->cpu_id = SOFTNIC_CPU_ID;
        p->sc = SOFTNIC_SC;
        p->tm.n_queues = SOFTNIC_TM_N_QUEUES;
@@ -468,11 +476,20 @@ pmd_parse_args(struct pmd_params *p, const char *params)
        /* Firmware script (optional) */
        if (rte_kvargs_count(kvlist, PMD_PARAM_FIRMWARE) == 1) {
                ret = rte_kvargs_process(kvlist, PMD_PARAM_FIRMWARE,
-                       &get_string, &p->firmware);
+                       &get_string, &firmware);
                if (ret < 0)
                        goto out_free;
        }
-
+       if (rte_strscpy(p->firmware, firmware,
+                       sizeof(p->firmware)) < 0) {
+               PMD_LOG(WARNING,
+                       "\"%s\": firmware path should be shorter than %zu",
+                       firmware, sizeof(p->firmware));
+               free(firmware);
+               ret = -EINVAL;
+               goto out_free;
+       }
+       free(firmware);
        /* Connection listening port (optional) */
        if (rte_kvargs_count(kvlist, PMD_PARAM_CONN_PORT) == 1) {
                ret = rte_kvargs_process(kvlist, PMD_PARAM_CONN_PORT,
@@ -621,7 +638,12 @@ pmd_probe(struct rte_vdev_device *vdev)
        if (status)
                return status;
 
-       p.name = name;
+       if (rte_strscpy(p.name, name, sizeof(p.name)) < 0) {
+               PMD_LOG(WARNING,
+                       "\"%s\": device name should be shorter than %zu",
+                       name, sizeof(p.name));
+               return -EINVAL;
+       }
 
        /* Allocate and initialize soft ethdev private data */
        dev_private = pmd_init(&p);
index 1b3186ef0bdb2b3f2050504865e7f2cc93eb180f..07285ca315a51d81557f6f2f5c9b7936f362f8c7 100644 (file)
 #include "conn.h"
 
 #define NAME_SIZE                                            64
+#define SOFTNIC_PATH_MAX                                     4096
 
 /**
  * PMD Parameters
  */
 
 struct pmd_params {
-       const char *name;
-       const char *firmware;
+       char name[NAME_SIZE];
+       char firmware[SOFTNIC_PATH_MAX];
        uint16_t conn_port;
        uint32_t cpu_id;
        int sc; /**< Service cores. */