audiohook: Don't allow audiohooks to attach to hung up channels.
Given a scenario where MixMonitor was initiated over AMI it was possible for the channel and MixMonitor thread to remain alive past hang up of the channel. This scenario required the AMI initiated MixMonitor to retrieve the channel, a hangup to occur on the channel in another thread, and then for MixMonitor to actually start. If this occurred the MixMonitor thread would remain alive indefinitely and the channel reference would remain. This change ensures that audiohooks are never able to be attached to channels that have been hung up. An additional fix has also been done in app_mixmonitor to properly release the channel reference if this occurs. ASTERISK-28780 Change-Id: I8044c06daa06f0f16607788c596f55623be26f58
This commit is contained in:
parent
59a708a935
commit
c40050d350
|
@ -987,6 +987,7 @@ static int launch_monitor_thread(struct ast_channel *chan, const char *filename,
|
|||
if (startmon(chan, &mixmonitor->audiohook)) {
|
||||
ast_log(LOG_WARNING, "Unable to add '%s' spy to channel '%s'\n",
|
||||
mixmonitor_spy_type, ast_channel_name(chan));
|
||||
ast_autochan_destroy(mixmonitor->autochan);
|
||||
ast_audiohook_destroy(&mixmonitor->audiohook);
|
||||
mixmonitor_free(mixmonitor);
|
||||
return -1;
|
||||
|
|
|
@ -502,6 +502,15 @@ int ast_audiohook_attach(struct ast_channel *chan, struct ast_audiohook *audioho
|
|||
{
|
||||
ast_channel_lock(chan);
|
||||
|
||||
/* Don't allow an audiohook to be attached to a channel that is already hung up.
|
||||
* The hang up process is what actually notifies the audiohook that it should
|
||||
* stop.
|
||||
*/
|
||||
if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_ZOMBIE)) {
|
||||
ast_channel_unlock(chan);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!ast_channel_audiohooks(chan)) {
|
||||
struct ast_audiohook_list *ahlist;
|
||||
/* Whoops... allocate a new structure */
|
||||
|
|
Loading…
Reference in New Issue