mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
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
This commit is contained in:
@@ -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
|
|||||||
|
|
||||||
/* 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
|
|||||||
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
|
|||||||
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
|
|||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
Reference in New Issue
Block a user