From 1744b82a0abcbd55859a56f277ba4922afc30cd4 Mon Sep 17 00:00:00 2001 From: Razvan Crainea Date: Wed, 24 Aug 2022 10:33:27 +0300 Subject: [PATCH] mi_script: prevent leak on write error case Thanks go to Suchi Sahoo from Five9 for reporting it (cherry picked from commit 443fdf90e635b48debcf71449e6c72754e3b24c7) --- modules/mi_script/mi_script.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/mi_script/mi_script.c b/modules/mi_script/mi_script.c index 3e49f0c7163..da3fd23f99f 100644 --- a/modules/mi_script/mi_script.c +++ b/modules/mi_script/mi_script.c @@ -541,6 +541,13 @@ struct mi_script_async_job { mi_request_t *req; }; +static void mi_script_async_job_free(struct mi_script_async_job *job) +{ + if (job->msg.s) + shm_free(job->msg.s); + shm_free(job); +} + static void mi_script_async_resume_job(int sender, void *param) { int ret; @@ -550,8 +557,9 @@ static void mi_script_async_resume_job(int sender, void *param) do { ret = write(job->fd, &r, sizeof r); } while (ret < 0 && (errno == EINTR || errno == EAGAIN)); - if (ret < 0) + if (ret < 0) { LM_ERR("could not notify resume: %s\n", strerror(errno)); + } } static void mi_script_async_job(mi_response_t *resp, struct mi_script_async_job *job) @@ -572,9 +580,7 @@ static void mi_script_async_job(mi_response_t *resp, struct mi_script_async_job if (ipc_send_rpc(job->process_no, mi_script_async_resume_job, job) < 0) { LM_ERR("could not resume async MI command!\n"); - if (job->msg.s) - shm_free(job->msg.s); - shm_free(job); + mi_script_async_job_free(job); } } @@ -654,9 +660,7 @@ static int mi_script_async_resume(int fd, ret = -3; } end: - if (job->msg.s) - shm_free(job->msg.s); - shm_free(job); + mi_script_async_job_free(job); return ret; }