net/mvpp2: fix memory leak in error path
authorYunjian Wang <wangyunjian@huawei.com>
Thu, 22 Oct 2020 04:25:27 +0000 (12:25 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 3 Nov 2020 22:24:26 +0000 (23:24 +0100)
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>
drivers/net/mvpp2/mrvl_mtr.c

index 39272ac..2fa5cb4 100644 (file)
@@ -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;