Denis Kirjanov 3c37ef
From d8f7942cdc53e4af192760820a0d087cdfdd280f Mon Sep 17 00:00:00 2001
Denis Kirjanov 3c37ef
From: Fugang Duan <fugang.duan@nxp.com>
Denis Kirjanov 3c37ef
Date: Wed, 12 May 2021 10:43:59 +0800
Denis Kirjanov 3c37ef
Subject: [PATCH 04/16] net: fec: fix the potential memory leak in
Denis Kirjanov 3c37ef
 fec_enet_init()
Denis Kirjanov 3c37ef
Git-commit: 619fee9eb13b5d29e4267cb394645608088c28a8
Denis Kirjanov 3c37ef
Patch-mainline: v5.13-rc4
Denis Kirjanov 3c37ef
References: git-fixes
Denis Kirjanov 3c37ef
Denis Kirjanov 3c37ef
If the memory allocated for cbd_base is failed, it should
Denis Kirjanov 3c37ef
free the memory allocated for the queues, otherwise it causes
Denis Kirjanov 3c37ef
memory leak.
Denis Kirjanov 3c37ef
Denis Kirjanov 3c37ef
And if the memory allocated for the queues is failed, it can
Denis Kirjanov 3c37ef
return error directly.
Denis Kirjanov 3c37ef
Denis Kirjanov 3c37ef
Fixes: 59d0f7465644 ("net: fec: init multi queue date structure")
Denis Kirjanov 3c37ef
Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
Denis Kirjanov 3c37ef
Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
Denis Kirjanov 3c37ef
Signed-off-by: David S. Miller <davem@davemloft.net>
Denis Kirjanov 3c37ef
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
Denis Kirjanov 3c37ef
---
Denis Kirjanov 3c37ef
 drivers/net/ethernet/freescale/fec_main.c | 11 +++++++++--
Denis Kirjanov 3c37ef
 1 file changed, 9 insertions(+), 2 deletions(-)
Denis Kirjanov 3c37ef
Denis Kirjanov 3c37ef
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
Denis Kirjanov 3c37ef
index 70a5039faa89..fa0a9df96ba0 100644
Denis Kirjanov 3c37ef
--- a/drivers/net/ethernet/freescale/fec_main.c
Denis Kirjanov 3c37ef
+++ b/drivers/net/ethernet/freescale/fec_main.c
Denis Kirjanov 3c37ef
@@ -3175,7 +3175,9 @@ static int fec_enet_init(struct net_device *ndev)
Denis Kirjanov 3c37ef
 		return ret;
Denis Kirjanov 3c37ef
 	}
Denis Kirjanov 3c37ef
 
Denis Kirjanov 3c37ef
-	fec_enet_alloc_queue(ndev);
Denis Kirjanov 3c37ef
+	ret = fec_enet_alloc_queue(ndev);
Denis Kirjanov 3c37ef
+	if (ret)
Denis Kirjanov 3c37ef
+		return ret;
Denis Kirjanov 3c37ef
 
Denis Kirjanov 3c37ef
 	bd_size = (fep->total_tx_ring_size + fep->total_rx_ring_size) * dsize;
Denis Kirjanov 3c37ef
 
Denis Kirjanov 3c37ef
@@ -3183,7 +3185,8 @@ static int fec_enet_init(struct net_device *ndev)
Denis Kirjanov 3c37ef
 	cbd_base = dmam_alloc_coherent(&fep->pdev->dev, bd_size, &bd_dma,
Denis Kirjanov 3c37ef
 				       GFP_KERNEL);
Denis Kirjanov 3c37ef
 	if (!cbd_base) {
Denis Kirjanov 3c37ef
-		return -ENOMEM;
Denis Kirjanov 3c37ef
+		ret = -ENOMEM;
Denis Kirjanov 3c37ef
+		goto free_queue_mem;
Denis Kirjanov 3c37ef
 	}
Denis Kirjanov 3c37ef
 
Denis Kirjanov 3c37ef
 	memset(cbd_base, 0, bd_size);
Denis Kirjanov 3c37ef
@@ -3260,6 +3263,10 @@ static int fec_enet_init(struct net_device *ndev)
Denis Kirjanov 3c37ef
 	fec_enet_update_ethtool_stats(ndev);
Denis Kirjanov 3c37ef
 
Denis Kirjanov 3c37ef
 	return 0;
Denis Kirjanov 3c37ef
+
Denis Kirjanov 3c37ef
+free_queue_mem:
Denis Kirjanov 3c37ef
+	fec_enet_free_queue(ndev);
Denis Kirjanov 3c37ef
+	return ret;
Denis Kirjanov 3c37ef
 }
Denis Kirjanov 3c37ef
 
Denis Kirjanov 3c37ef
 #ifdef CONFIG_OF
Denis Kirjanov 3c37ef
-- 
Denis Kirjanov 3c37ef
2.16.4
Denis Kirjanov 3c37ef