mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-17 02:02:22 +00:00
Fix potential bridge hook resource leak if the hook install fails.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@392335 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -4893,6 +4893,15 @@ int ast_bridge_dtmf_hook(struct ast_bridge_features *features,
|
||||
|
||||
/* Once done we put it in the container. */
|
||||
res = ao2_link(features->dtmf_hooks, hook) ? 0 : -1;
|
||||
if (res) {
|
||||
/*
|
||||
* Could not link the hook into the container.
|
||||
*
|
||||
* Remove the hook_pvt destructor call from the hook since we
|
||||
* are returning failure to install the hook.
|
||||
*/
|
||||
hook->destructor = NULL;
|
||||
}
|
||||
ao2_ref(hook, -1);
|
||||
|
||||
return res;
|
||||
@@ -4916,6 +4925,15 @@ int ast_bridge_hangup_hook(struct ast_bridge_features *features,
|
||||
|
||||
/* Once done we put it in the container. */
|
||||
res = ao2_link(features->hangup_hooks, hook) ? 0 : -1;
|
||||
if (res) {
|
||||
/*
|
||||
* Could not link the hook into the container.
|
||||
*
|
||||
* Remove the hook_pvt destructor call from the hook since we
|
||||
* are returning failure to install the hook.
|
||||
*/
|
||||
hook->destructor = NULL;
|
||||
}
|
||||
ao2_ref(hook, -1);
|
||||
|
||||
return res;
|
||||
@@ -4939,6 +4957,15 @@ int ast_bridge_join_hook(struct ast_bridge_features *features,
|
||||
|
||||
/* Once done we put it in the container. */
|
||||
res = ao2_link(features->join_hooks, hook) ? 0 : -1;
|
||||
if (res) {
|
||||
/*
|
||||
* Could not link the hook into the container.
|
||||
*
|
||||
* Remove the hook_pvt destructor call from the hook since we
|
||||
* are returning failure to install the hook.
|
||||
*/
|
||||
hook->destructor = NULL;
|
||||
}
|
||||
ao2_ref(hook, -1);
|
||||
|
||||
return res;
|
||||
@@ -4962,6 +4989,15 @@ int ast_bridge_leave_hook(struct ast_bridge_features *features,
|
||||
|
||||
/* Once done we put it in the container. */
|
||||
res = ao2_link(features->leave_hooks, hook) ? 0 : -1;
|
||||
if (res) {
|
||||
/*
|
||||
* Could not link the hook into the container.
|
||||
*
|
||||
* Remove the hook_pvt destructor call from the hook since we
|
||||
* are returning failure to install the hook.
|
||||
*/
|
||||
hook->destructor = NULL;
|
||||
}
|
||||
ao2_ref(hook, -1);
|
||||
|
||||
return res;
|
||||
@@ -5013,11 +5049,17 @@ int ast_bridge_interval_hook(struct ast_bridge_features *features,
|
||||
hook, hook->parms.timer.interval, features);
|
||||
ast_heap_wrlock(features->interval_hooks);
|
||||
res = ast_heap_push(features->interval_hooks, hook);
|
||||
ast_heap_unlock(features->interval_hooks);
|
||||
if (res) {
|
||||
/* Could not push the hook onto the heap. */
|
||||
/*
|
||||
* Could not push the hook into the heap
|
||||
*
|
||||
* Remove the hook_pvt destructor call from the hook since we
|
||||
* are returning failure to install the hook.
|
||||
*/
|
||||
hook->destructor = NULL;
|
||||
ao2_ref(hook, -1);
|
||||
}
|
||||
ast_heap_unlock(features->interval_hooks);
|
||||
|
||||
return res ? -1 : 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user