فهرست منبع

msm: adsprpc: fix memory leak scenario in print debug data

Add proper return path to ensure that allocated memory for gmsglog
variables is freed before exiting. In error cases when returning
from the function without proper exit handling, not freeing allocated
memory leads to memory leak.

Change-Id: I718a6a3d1fef8598cb67e7d627bde00a8b009324
Signed-off-by: Ansa Ahmed <[email protected]>
Ansa Ahmed 1 سال پیش
والد
کامیت
5c26a308b1
1فایلهای تغییر یافته به همراه14 افزوده شده و 9 حذف شده
  1. 14 9
      dsp/adsprpc.c

+ 14 - 9
dsp/adsprpc.c

@@ -3512,9 +3512,13 @@ static int fastrpc_wait_on_async_queue(
 	struct hlist_node *n;
 	struct hlist_node *n;
 
 
 read_async_job:
 read_async_job:
+	if (!fl) {
+		err = -EBADF;
+		goto bail;
+	}
 	interrupted = wait_event_interruptible(fl->async_wait_queue,
 	interrupted = wait_event_interruptible(fl->async_wait_queue,
 				atomic_read(&fl->async_queue_job_count));
 				atomic_read(&fl->async_queue_job_count));
-	if (!fl || fl->file_close >= FASTRPC_PROCESS_EXIT_START) {
+	if (fl->file_close >= FASTRPC_PROCESS_EXIT_START) {
 		err = -EBADF;
 		err = -EBADF;
 		goto bail;
 		goto bail;
 	}
 	}
@@ -3598,12 +3602,12 @@ static int fastrpc_wait_on_notif_queue(
 	struct smq_notif_rsp  *notif = NULL, *inotif = NULL, *n = NULL;
 	struct smq_notif_rsp  *notif = NULL, *inotif = NULL, *n = NULL;
 
 
 read_notif_status:
 read_notif_status:
+        if (!fl) {
+                err = -EBADF;
+                goto bail;
+        }
 	interrupted = wait_event_interruptible(fl->proc_state_notif.notif_wait_queue,
 	interrupted = wait_event_interruptible(fl->proc_state_notif.notif_wait_queue,
 				atomic_read(&fl->proc_state_notif.notif_queue_count));
 				atomic_read(&fl->proc_state_notif.notif_queue_count));
-	if (!fl) {
-		err = -EBADF;
-		goto bail;
-	}
 	if (fl->exit_notif) {
 	if (fl->exit_notif) {
 		err = -EFAULT;
 		err = -EFAULT;
 		goto bail;
 		goto bail;
@@ -7613,20 +7617,20 @@ static void  fastrpc_print_debug_data(int cid)
 	VERIFY(err, NULL != (gmsg_log_tx = kzalloc(MD_GMSG_BUFFER, GFP_KERNEL)));
 	VERIFY(err, NULL != (gmsg_log_tx = kzalloc(MD_GMSG_BUFFER, GFP_KERNEL)));
 	if (err) {
 	if (err) {
 		err = -ENOMEM;
 		err = -ENOMEM;
-		return;
+		goto free_buf;
 	}
 	}
 	VERIFY(err, NULL != (gmsg_log_rx = kzalloc(MD_GMSG_BUFFER, GFP_KERNEL)));
 	VERIFY(err, NULL != (gmsg_log_rx = kzalloc(MD_GMSG_BUFFER, GFP_KERNEL)));
 	if (err) {
 	if (err) {
 		err = -ENOMEM;
 		err = -ENOMEM;
-		return;
+                goto free_buf;
 	}
 	}
 	chan = &me->channel[cid];
 	chan = &me->channel[cid];
 	if ((!chan) || (!chan->buf))
 	if ((!chan) || (!chan->buf))
-		return;
+                goto free_buf;
 
 
 	mini_dump_buff = chan->buf->virt;
 	mini_dump_buff = chan->buf->virt;
 	if (!mini_dump_buff)
 	if (!mini_dump_buff)
-		return;
+                goto free_buf;
 
 
 	if (chan) {
 	if (chan) {
 		tx_index = chan->gmsg_log.tx_index;
 		tx_index = chan->gmsg_log.tx_index;
@@ -7772,6 +7776,7 @@ static void  fastrpc_print_debug_data(int cid)
 			"gmsg_log_rx:\n %s\n", gmsg_log_rx);
 			"gmsg_log_rx:\n %s\n", gmsg_log_rx);
 	if (chan && chan->buf)
 	if (chan && chan->buf)
 		chan->buf->size = strlen(mini_dump_buff);
 		chan->buf->size = strlen(mini_dump_buff);
+free_buf:
 	kfree(gmsg_log_tx);
 	kfree(gmsg_log_tx);
 	kfree(gmsg_log_rx);
 	kfree(gmsg_log_rx);
 }
 }