summaryrefslogtreecommitdiff
path: root/main/core_unreal.c
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2014-05-25 02:37:03 +0000
committerMatthew Jordan <mjordan@digium.com>2014-05-25 02:37:03 +0000
commit09bbfa76ab589a440d954b29b2facc32e0d22248 (patch)
tree3c2fefc89cfa455e63ecfa5a3079c9eb66964f33 /main/core_unreal.c
parenta7d9f2f59506d2b2905c2e03d3ff3ea8d325c919 (diff)
core_unreal: Prevent double free of core_unreal pvt
When a channel is destroyed (such as via ast_channel_release in off nominal paths in core_unreal), it will attempt to free (via ast_free) the channel tech pvt. This is problematic for a few reasons: 1. The channel tech pvt is an ao2 object in core_unreal. Free'ing the pvt directly is no good. 2. The channel tech pvt's reference count is dropped just prior to calling ast_channel_release, resulting in the pvt's destruction. Hence, the channel destructor is free'ing an invalid pointer. This patch keeps the dropping of the reference count, but sets the pvt to NULL on the channel prior to releasing it. This models what would occur if the channel was hung up directly. ........ Merged revisions 414542 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@414543 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/core_unreal.c')
-rw-r--r--main/core_unreal.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/main/core_unreal.c b/main/core_unreal.c
index ae7f9d2ab..481ed2d0c 100644
--- a/main/core_unreal.c
+++ b/main/core_unreal.c
@@ -955,6 +955,7 @@ struct ast_channel *ast_unreal_new_channels(struct ast_unreal_pvt *p,
if (ast_channel_cc_params_init(owner, requestor
? ast_channel_get_cc_config_params((struct ast_channel *) requestor) : NULL)) {
ao2_ref(p, -1);
+ ast_channel_tech_pvt_set(owner, NULL);
ast_channel_unlock(owner);
ast_channel_release(owner);
return NULL;
@@ -968,6 +969,7 @@ struct ast_channel *ast_unreal_new_channels(struct ast_unreal_pvt *p,
"%s/%s-%08x;2", tech->type, p->name, (unsigned)generated_seqno))) {
ast_log(LOG_WARNING, "Unable to allocate chan channel structure\n");
ao2_ref(p, -1);
+ ast_channel_tech_pvt_set(owner, NULL);
ast_channel_release(owner);
return NULL;
}