net/mvpp2: fix memory leak in error path
Checks
Commit Message
From: Yunjian Wang <wangyunjian@huawei.com>
In mrvl_create() allocated memory for 'mtr', we don't free it
when profile get fails and it will lead to memory leak.
We can get profile at the beginning of the function to
fix it, before calling mtr = rte_zmalloc_socket().
Fixes: cdb53f8da628 ("net/mvpp2: support metering")
Cc: stable@dpdk.org
Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
---
drivers/net/mvpp2/mrvl_mtr.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
Comments
Acked-by: Liron Himi <lironh@marvell.com>
-----Original Message-----
From: wangyunjian <wangyunjian@huawei.com>
Sent: Thursday, 22 October 2020 07:25
To: dev@dpdk.org
Cc: Liron Himi <lironh@marvell.com>; jerry.lilijun@huawei.com; xudingke@huawei.com; Yunjian Wang <wangyunjian@huawei.com>; stable@dpdk.org
Subject: [EXT] [dpdk-dev] [PATCH] net/mvpp2: fix memory leak in error path
External Email
----------------------------------------------------------------------
From: Yunjian Wang <wangyunjian@huawei.com>
In mrvl_create() allocated memory for 'mtr', we don't free it when profile get fails and it will lead to memory leak.
We can get profile at the beginning of the function to fix it, before calling mtr = rte_zmalloc_socket().
Fixes: cdb53f8da628 ("net/mvpp2: support metering")
Cc: stable@dpdk.org
Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
---
drivers/net/mvpp2/mrvl_mtr.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/net/mvpp2/mrvl_mtr.c b/drivers/net/mvpp2/mrvl_mtr.c index 39272acea4..2fa5cb43ad 100644
--- a/drivers/net/mvpp2/mrvl_mtr.c
+++ b/drivers/net/mvpp2/mrvl_mtr.c
@@ -329,6 +329,12 @@ mrvl_create(struct rte_eth_dev *dev, uint32_t mtr_id,
struct mrvl_mtr_profile *profile;
struct mrvl_mtr *mtr;
+ profile = mrvl_mtr_profile_from_id(priv, params->meter_profile_id);
+ if (!profile)
+ return -rte_mtr_error_set(error, EINVAL,
+ RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+ NULL, "Profile id does not exist\n");
+
mtr = mrvl_mtr_from_id(priv, mtr_id);
if (mtr)
return -rte_mtr_error_set(error, EEXIST, @@ -341,12 +347,6 @@ mrvl_create(struct rte_eth_dev *dev, uint32_t mtr_id,
RTE_MTR_ERROR_TYPE_UNSPECIFIED,
NULL, NULL);
- profile = mrvl_mtr_profile_from_id(priv, params->meter_profile_id);
- if (!profile)
- return -rte_mtr_error_set(error, EINVAL,
- RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
- NULL, "Profile id does not exist\n");
-
mtr->shared = shared;
mtr->mtr_id = mtr_id;
mtr->plcr_bit = MRVL_PLCR_BIT_INVALID;
--
2.23.0
On 10/22/2020 7:40 AM, Liron Himi wrote:
<...>
> Subject: [EXT] [dpdk-dev] [PATCH] net/mvpp2: fix memory leak in error path
>
> External Email
>
> ----------------------------------------------------------------------
> From: Yunjian Wang <wangyunjian@huawei.com>
>
> In mrvl_create() allocated memory for 'mtr', we don't free it when profile get fails and it will lead to memory leak.
>
> We can get profile at the beginning of the function to fix it, before calling mtr = rte_zmalloc_socket().
>
> Fixes: cdb53f8da628 ("net/mvpp2: support metering")
> Cc: stable@dpdk.org
>
> Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
>
> Acked-by: Liron Himi <lironh@marvell.com>
>
Applied to dpdk-next-net/main, thanks.
@@ -329,6 +329,12 @@ mrvl_create(struct rte_eth_dev *dev, uint32_t mtr_id,
struct mrvl_mtr_profile *profile;
struct mrvl_mtr *mtr;
+ profile = mrvl_mtr_profile_from_id(priv, params->meter_profile_id);
+ if (!profile)
+ return -rte_mtr_error_set(error, EINVAL,
+ RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+ NULL, "Profile id does not exist\n");
+
mtr = mrvl_mtr_from_id(priv, mtr_id);
if (mtr)
return -rte_mtr_error_set(error, EEXIST,
@@ -341,12 +347,6 @@ mrvl_create(struct rte_eth_dev *dev, uint32_t mtr_id,
RTE_MTR_ERROR_TYPE_UNSPECIFIED,
NULL, NULL);
- profile = mrvl_mtr_profile_from_id(priv, params->meter_profile_id);
- if (!profile)
- return -rte_mtr_error_set(error, EINVAL,
- RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
- NULL, "Profile id does not exist\n");
-
mtr->shared = shared;
mtr->mtr_id = mtr_id;
mtr->plcr_bit = MRVL_PLCR_BIT_INVALID;