libertas: fix some memleaks in lbs_allocate_cmd_buffer

Message ID 20240126075336.2825608-1-alexious@zju.edu.cn
State New
Headers
Series libertas: fix some memleaks in lbs_allocate_cmd_buffer |

Commit Message

Zhipeng Lu Jan. 26, 2024, 7:53 a.m. UTC
  In the for statement of lbs_allocate_cmd_buffer, if the allocation of
cmdarray[i].cmdbuf fails, both cmdarray and cmdarray[i].cmdbuf needs to
be freed. Otherwise, there will be memleaks in lbs_allocate_cmd_buffer.

Fixes: 876c9d3aeb98 ("[PATCH] Marvell Libertas 8388 802.11b/g USB driver")
Signed-off-by: Zhipeng Lu <alexious@zju.edu.cn>
---
 drivers/net/wireless/marvell/libertas/cmd.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
  

Comments

Kalle Valo Feb. 5, 2024, 6:15 p.m. UTC | #1
Zhipeng Lu <alexious@zju.edu.cn> wrote:

> In the for statement of lbs_allocate_cmd_buffer(), if the allocation of
> cmdarray[i].cmdbuf fails, both cmdarray and cmdarray[i].cmdbuf needs to
> be freed. Otherwise, there will be memleaks in lbs_allocate_cmd_buffer().
> 
> Fixes: 876c9d3aeb98 ("[PATCH] Marvell Libertas 8388 802.11b/g USB driver")
> Signed-off-by: Zhipeng Lu <alexious@zju.edu.cn>

Patch applied to wireless-next.git, thanks.

5f0e4aede01c wifi: libertas: fix some memleaks in lbs_allocate_cmd_buffer()
  

Patch

diff --git a/drivers/net/wireless/marvell/libertas/cmd.c b/drivers/net/wireless/marvell/libertas/cmd.c
index 104d2b6dc9af..5a525da434c2 100644
--- a/drivers/net/wireless/marvell/libertas/cmd.c
+++ b/drivers/net/wireless/marvell/libertas/cmd.c
@@ -1132,7 +1132,7 @@  int lbs_allocate_cmd_buffer(struct lbs_private *priv)
 		if (!cmdarray[i].cmdbuf) {
 			lbs_deb_host("ALLOC_CMD_BUF: ptempvirtualaddr is NULL\n");
 			ret = -1;
-			goto done;
+			goto free_cmd_array;
 		}
 	}
 
@@ -1140,8 +1140,17 @@  int lbs_allocate_cmd_buffer(struct lbs_private *priv)
 		init_waitqueue_head(&cmdarray[i].cmdwait_q);
 		lbs_cleanup_and_insert_cmd(priv, &cmdarray[i]);
 	}
-	ret = 0;
+	return 0;
 
+free_cmd_array:
+	for (i = 0; i < LBS_NUM_CMD_BUFFERS; i++) {
+		if (cmdarray[i].cmdbuf) {
+			kfree(cmdarray[i].cmdbuf);
+			cmdarray[i].cmdbuf = NULL;
+		}
+	}
+	kfree(priv->cmd_array);
+	priv->cmd_array = NULL;
 done:
 	return ret;
 }