diff options
author | Richard Mudgett <rmudgett@digium.com> | 2015-01-13 18:16:32 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2015-01-13 18:16:32 +0000 |
commit | 1f94b9674914467f68e1239f6999bbf5e3b7f292 (patch) | |
tree | b51e15511a89292ef3dbbbc32cb836f84858a6b5 /apps | |
parent | 056f11ac65fb698ca26fd9a85e1eb81dbc2df381 (diff) |
app_macro: Don't restore the calling location on a channel redirect.
v11: If a channel redirect to a macro exten of a macro that is active
happens, the redirect location doesn't get executed. Instead the original
macro location is restored and gets reexecuted.
v13: An additional effect happens if a parked call times out to an
extension in the macro that parked the call then the macro is reexecuted
instead of the expected park return location.
* Made not restore the macro calling location on an
AST_SOFTHANGUP_ASYNCGOTO.
* Increased the locked channel range when setting up the macro execution
environment to cover things that should be done while the channel is
locked.
* Removed unnecessary NULL tests before calling ast_free() in
_macro_exec().
ASTERISK-23850 #close
Reported by: Andrew Nagy
Review: https://reviewboard.asterisk.org/r/4292/
........
Merged revisions 430564 from http://svn.asterisk.org/svn/asterisk/branches/11
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@430565 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_macro.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/apps/app_macro.c b/apps/app_macro.c index 874895467..d8fd47fb1 100644 --- a/apps/app_macro.c +++ b/apps/app_macro.c @@ -376,9 +376,10 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive pbx_builtin_setvar_helper(chan, varname, cur); argc++; } - ast_channel_unlock(chan); autoloopflag = ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_AUTOLOOP); ast_set_flag(ast_channel_flags(chan), AST_FLAG_IN_AUTOLOOP); + ast_channel_unlock(chan); + while (ast_exists_extension(chan, ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan), S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL))) { struct ast_context *c; @@ -503,7 +504,10 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive /* don't stop executing extensions when we're in "h" */ if (ast_check_hangup(chan) && !inhangup) { - ast_debug(1, "Extension %s, macroexten %s, priority %d returned normally even though call was hung up\n", ast_channel_exten(chan), ast_channel_macroexten(chan), ast_channel_priority(chan)); + ast_debug(1, "Extension %s, macroexten %s, priority %d returned normally even though call was hung up\n", + ast_channel_exten(chan), + ast_channel_macroexten(chan), + ast_channel_priority(chan)); goto out; } ast_channel_priority_set(chan, ast_channel_priority(chan) + 1); @@ -522,24 +526,17 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive for (x = 1; x < argc; x++) { /* Restore old arguments and delete ours */ snprintf(varname, sizeof(varname), "ARG%d", x); - if (oldargs[x]) { - pbx_builtin_setvar_helper(chan, varname, oldargs[x]); - ast_free(oldargs[x]); - } else { - pbx_builtin_setvar_helper(chan, varname, NULL); - } + pbx_builtin_setvar_helper(chan, varname, oldargs[x]); + ast_free(oldargs[x]); } /* Restore macro variables */ pbx_builtin_setvar_helper(chan, "MACRO_EXTEN", save_macro_exten); pbx_builtin_setvar_helper(chan, "MACRO_CONTEXT", save_macro_context); pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority); - if (save_macro_exten) - ast_free(save_macro_exten); - if (save_macro_context) - ast_free(save_macro_context); - if (save_macro_priority) - ast_free(save_macro_priority); + ast_free(save_macro_exten); + ast_free(save_macro_context); + ast_free(save_macro_priority); if (setmacrocontext) { ast_channel_macrocontext_set(chan, ""); @@ -547,7 +544,8 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive ast_channel_macropriority_set(chan, 0); } - if (!strcasecmp(ast_channel_context(chan), fullmacro)) { + if (!strcasecmp(ast_channel_context(chan), fullmacro) + && !(ast_channel_softhangup_internal_flag(chan) & AST_SOFTHANGUP_ASYNCGOTO)) { const char *offsets; /* If we're leaving the macro normally, restore original information */ @@ -568,8 +566,7 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive } pbx_builtin_setvar_helper(chan, "MACRO_OFFSET", save_macro_offset); - if (save_macro_offset) - ast_free(save_macro_offset); + ast_free(save_macro_offset); /* Unlock the macro */ if (exclusive) { |