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 <quic_ansa@quicinc.com>
This commit is contained in:
@@ -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:
|
||||||
interrupted = wait_event_interruptible(fl->proc_state_notif.notif_wait_queue,
|
|
||||||
atomic_read(&fl->proc_state_notif.notif_queue_count));
|
|
||||||
if (!fl) {
|
if (!fl) {
|
||||||
err = -EBADF;
|
err = -EBADF;
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
interrupted = wait_event_interruptible(fl->proc_state_notif.notif_wait_queue,
|
||||||
|
atomic_read(&fl->proc_state_notif.notif_queue_count));
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user