From: Richard Mudgett Date: Mon, 25 Aug 2014 16:45:40 +0000 (+0000) Subject: res_musiconhold.c: Release any format refs before memset(). X-Git-Tag: 14.0.0-beta1~1708 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fefa6fba82e36a9dd0e1eab67c87345894cce14a;p=thirdparty%2Fasterisk.git 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 --- diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index 00a2fa2c05..cbeaab535c 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); }