Skip to content
Snippets Groups Projects
Commit 1780de95 authored by Richard Mudgett's avatar Richard Mudgett
Browse files

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
........

Merged revisions 430565 from http://svn.asterisk.org/svn/asterisk/branches/13


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@430567 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent 0e631a54
No related branches found
No related tags found
No related merge requests found
...@@ -376,9 +376,10 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive ...@@ -376,9 +376,10 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive
pbx_builtin_setvar_helper(chan, varname, cur); pbx_builtin_setvar_helper(chan, varname, cur);
argc++; argc++;
} }
ast_channel_unlock(chan);
autoloopflag = ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_AUTOLOOP); autoloopflag = ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_AUTOLOOP);
ast_set_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), 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))) { S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL))) {
struct ast_context *c; struct ast_context *c;
...@@ -503,7 +504,10 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive ...@@ -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" */ /* don't stop executing extensions when we're in "h" */
if (ast_check_hangup(chan) && !inhangup) { 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; goto out;
} }
ast_channel_priority_set(chan, ast_channel_priority(chan) + 1); 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 ...@@ -522,24 +526,17 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive
for (x = 1; x < argc; x++) { for (x = 1; x < argc; x++) {
/* Restore old arguments and delete ours */ /* Restore old arguments and delete ours */
snprintf(varname, sizeof(varname), "ARG%d", x); snprintf(varname, sizeof(varname), "ARG%d", x);
if (oldargs[x]) { pbx_builtin_setvar_helper(chan, varname, oldargs[x]);
pbx_builtin_setvar_helper(chan, varname, oldargs[x]); ast_free(oldargs[x]);
ast_free(oldargs[x]);
} else {
pbx_builtin_setvar_helper(chan, varname, NULL);
}
} }
/* Restore macro variables */ /* Restore macro variables */
pbx_builtin_setvar_helper(chan, "MACRO_EXTEN", save_macro_exten); 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_CONTEXT", save_macro_context);
pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority); pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority);
if (save_macro_exten) ast_free(save_macro_exten);
ast_free(save_macro_exten); ast_free(save_macro_context);
if (save_macro_context) ast_free(save_macro_priority);
ast_free(save_macro_context);
if (save_macro_priority)
ast_free(save_macro_priority);
if (setmacrocontext) { if (setmacrocontext) {
ast_channel_macrocontext_set(chan, ""); ast_channel_macrocontext_set(chan, "");
...@@ -547,7 +544,8 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive ...@@ -547,7 +544,8 @@ static int _macro_exec(struct ast_channel *chan, const char *data, int exclusive
ast_channel_macropriority_set(chan, 0); 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; const char *offsets;
/* If we're leaving the macro normally, restore original information */ /* 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 ...@@ -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); 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 */ /* Unlock the macro */
if (exclusive) { if (exclusive) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment