diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c index 9911bc4ecc8d6a719751b16b8a055fe062a33430..bb1bc51d0c8338428aaf8afbda4f79907b13a263 100644 --- a/apps/app_mixmonitor.c +++ b/apps/app_mixmonitor.c @@ -990,6 +990,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; diff --git a/main/audiohook.c b/main/audiohook.c index 4db32ea7c0de0222150306e4d46a4f9e80bece3f..ed16897be05de03e398b5688d74f025a6bcd9aaf 100644 --- a/main/audiohook.c +++ b/main/audiohook.c @@ -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 */