summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2016-01-22 15:08:58 -0600
committerMark Michelson <mmichelson@digium.com>2016-01-22 15:08:58 -0600
commit1003c2eb0505c34c6fe3ebd587fe3adf413b979a (patch)
tree89cbb80fcc67ffee98157b1ff1a34f5804c72fd3
parent1c95b211a0416c0d9ee0a732fe5615a356e7c12f (diff)
Stasis: Fix potential memory leak of control data.
When queuing tasks onto the Stasis control queue, you can pass an arbitrary data pointer and a function to free that data. All ARI commands that use the Stasis control queue made the assumption that the destructor function would be called in all paths, whether the task was queued successfully or not. However, this was not correct. If a task was queued onto a control structure that was already completed, the allocated data would not be freed properly. This patch corrects this by making sure that all return paths call the data destructor. Change-Id: Ibf06522094f8e5c4cce652537dc5d7222b1c4fcb
-rw-r--r--res/stasis/control.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/res/stasis/control.c b/res/stasis/control.c
index 87362df16..badd991d9 100644
--- a/res/stasis/control.c
+++ b/res/stasis/control.c
@@ -746,6 +746,14 @@ static int app_send_command_on_condition(struct stasis_app_control *control,
RAII_VAR(struct stasis_app_command *, command, NULL, ao2_cleanup);
if (control == NULL || control->is_done) {
+ /* If exec_command_on_condition fails, it calls the data_destructor.
+ * In order to provide consistent behavior, we'll also call the data_destructor
+ * on this error path. This way, callers never have to call the
+ * data_destructor themselves.
+ */
+ if (data_destructor) {
+ data_destructor(data);
+ }
return -1;
}
@@ -771,6 +779,14 @@ int stasis_app_send_command_async(struct stasis_app_control *control,
RAII_VAR(struct stasis_app_command *, command, NULL, ao2_cleanup);
if (control == NULL || control->is_done) {
+ /* If exec_command fails, it calls the data_destructor. In order to
+ * provide consistent behavior, we'll also call the data_destructor
+ * on this error path. This way, callers never have to call the
+ * data_destructor themselves.
+ */
+ if (data_destructor) {
+ data_destructor(data);
+ }
return -1;
}