octeontx2-af: fix memory leak of lmac and lmac->name
authorColin Ian King <colin.king@canonical.com>
Thu, 7 Jan 2021 12:39:16 +0000 (12:39 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 17 Jan 2021 13:16:57 +0000 (14:16 +0100)
[ Upstream commit ac7996d680d8b4a51bb99bbdcee3dc838b985498 ]

Currently the error return paths don't kfree lmac and lmac->name
leading to some memory leaks.  Fix this by adding two error return
paths that kfree these objects

Addresses-Coverity: ("Resource leak")
Fixes: 1463f382f58d ("octeontx2-af: Add support for CGX link management")
Signed-off-by: Colin Ian King <colin.king@canonical.com>
Link: https://lore.kernel.org/r/20210107123916.189748-1-colin.king@canonical.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/marvell/octeontx2/af/cgx.c

index 8f17e26..fc27a40 100644 (file)
@@ -862,8 +862,10 @@ static int cgx_lmac_init(struct cgx *cgx)
                if (!lmac)
                        return -ENOMEM;
                lmac->name = kcalloc(1, sizeof("cgx_fwi_xxx_yyy"), GFP_KERNEL);
-               if (!lmac->name)
-                       return -ENOMEM;
+               if (!lmac->name) {
+                       err = -ENOMEM;
+                       goto err_lmac_free;
+               }
                sprintf(lmac->name, "cgx_fwi_%d_%d", cgx->cgx_id, i);
                lmac->lmac_id = i;
                lmac->cgx = cgx;
@@ -874,7 +876,7 @@ static int cgx_lmac_init(struct cgx *cgx)
                                                 CGX_LMAC_FWI + i * 9),
                                   cgx_fwi_event_handler, 0, lmac->name, lmac);
                if (err)
-                       return err;
+                       goto err_irq;
 
                /* Enable interrupt */
                cgx_write(cgx, lmac->lmac_id, CGXX_CMRX_INT_ENA_W1S,
@@ -886,6 +888,12 @@ static int cgx_lmac_init(struct cgx *cgx)
        }
 
        return cgx_lmac_verify_fwi_version(cgx);
+
+err_irq:
+       kfree(lmac->name);
+err_lmac_free:
+       kfree(lmac);
+       return err;
 }
 
 static int cgx_lmac_exit(struct cgx *cgx)