res_stasis: Plug reference leak on stolen channels

When a stasis channel is stolen by another app, the control
structure is unreffed but never unlinked from the app_controls
container.  This causes the channel reference to leak.

Added OBJ_UNLINK to the callback in channel_stolen_cb.

Also added some additional channel lifecycle debug messages to
channel.c.

ASTERISK-27059 #close
Repoorted-by: George Joseph

Change-Id: Ib820936cd49453f20156971785e7f4f182c56e14
This commit is contained in:
George Joseph
2017-06-16 08:31:04 -06:00
committed by Richard Mudgett
parent 0405185357
commit 854a6de819
2 changed files with 24 additions and 5 deletions

View File

@@ -998,6 +998,9 @@ __ast_channel_alloc_ap(int needqueue, int state, const char *cid_num, const char
* the world know of its existance
*/
ast_channel_stage_snapshot_done(tmp);
ast_debug(1, "Channel %p '%s' allocated\n", tmp, ast_channel_name(tmp));
return tmp;
}
@@ -2217,6 +2220,8 @@ static void ast_channel_destructor(void *obj)
char device_name[AST_CHANNEL_NAME];
ast_callid callid;
ast_debug(1, "Channel %p '%s' destroying\n", chan, ast_channel_name(chan));
/* Stop monitoring */
if (ast_channel_monitor(chan)) {
ast_channel_monitor(chan)->stop(chan, 0);
@@ -2579,6 +2584,9 @@ void ast_hangup(struct ast_channel *chan)
return;
}
ast_debug(1, "Channel %p '%s' hanging up. Refs: %d\n", chan, ast_channel_name(chan),
ao2_ref(chan, 0));
ast_autoservice_stop(chan);
ast_channel_lock(chan);
@@ -2638,7 +2646,6 @@ void ast_hangup(struct ast_channel *chan)
ast_assert(ast_test_flag(ast_channel_flags(chan), AST_FLAG_BLOCKING) == 0);
}
ast_debug(1, "Hanging up channel '%s'\n", ast_channel_name(chan));
if (ast_channel_tech(chan)->hangup) {
ast_channel_tech(chan)->hangup(chan);
}