[v4] net/softnic: fix memory leak in parsing arguments
Checks
Commit Message
From: Dapeng Yu <dapengx.yu@intel.com>
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>
---
V2:
* improve the patch according to maintainer's comment:
rte_strscpy() is the best option here.
V3:
* improve the handling of string copy, to make the code more robust
V4:
* replace RTE_DEV_NAME_MAX_LEN with NAME_SIZE
* replace PATH_MAX with SOFTNIC_PATH_MAX
---
drivers/net/softnic/rte_eth_softnic.c | 30 ++++++++++++++++---
.../net/softnic/rte_eth_softnic_internals.h | 5 ++--
2 files changed, 29 insertions(+), 6 deletions(-)
Comments
> -----Original Message-----
> From: Yu, DapengX <dapengx.yu@intel.com>
> Sent: Thursday, July 15, 2021 6:38 AM
> To: Singh, Jasvinder <jasvinder.singh@intel.com>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>
> Cc: dev@dpdk.org; Yu, DapengX <dapengx.yu@intel.com>; stable@dpdk.org
> Subject: [PATCH v4] net/softnic: fix memory leak in parsing arguments
>
> From: Dapeng Yu <dapengx.yu@intel.com>
>
> 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>
> > From: Dapeng Yu <dapengx.yu@intel.com>
> >
> > 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>
Applied, thanks.
@@ -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);
@@ -28,14 +28,15 @@
#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. */