From fefa6fba82e36a9dd0e1eab67c87345894cce14a Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Mon, 25 Aug 2014 16:45:40 +0000 Subject: res_musiconhold.c: Release any format refs before memset(). * Clear the channel music_state pointer before destroying the music_state object for safety. ........ Merged revisions 422037 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@422038 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_musiconhold.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'res/res_musiconhold.c') diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index 00a2fa2c0..cbeaab535 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -479,6 +479,8 @@ static void *moh_files_alloc(struct ast_channel *chan, void *params) /* Resume MOH from where we left off last time or start from scratch? */ if (state->save_total != class->total_files || strcmp(state->name, class->name) != 0) { /* Start MOH from scratch. */ + ao2_cleanup(state->origwfmt); + ao2_cleanup(state->mohwfmt); memset(state, 0, sizeof(*state)); if (ast_test_flag(class, MOH_RANDOMIZE) && class->total_files) { state->pos = ast_random() % class->total_files; @@ -974,6 +976,8 @@ static void *moh_alloc(struct ast_channel *chan, void *params) mohclass_unref(state->class, "Uh Oh. Restarting MOH with an active class"); ast_log(LOG_WARNING, "Uh Oh. Restarting MOH with an active class\n"); } + ao2_cleanup(state->origwfmt); + ao2_cleanup(state->mohwfmt); memset(state, 0, sizeof(*state)); } @@ -1304,6 +1308,7 @@ static void local_ast_moh_cleanup(struct ast_channel *chan) struct moh_files_state *state = ast_channel_music_state(chan); if (state) { + ast_channel_music_state_set(chan, NULL); if (state->class) { /* This should never happen. We likely just leaked some resource. */ state->class = @@ -1312,8 +1317,7 @@ static void local_ast_moh_cleanup(struct ast_channel *chan) } ao2_cleanup(state->origwfmt); ao2_cleanup(state->mohwfmt); - ast_free(ast_channel_music_state(chan)); - ast_channel_music_state_set(chan, NULL); + ast_free(state); /* Only held a module reference if we had a music state */ ast_module_unref(ast_module_info->self); } -- cgit v1.2.3