From: Tilghman Lesher Date: Tue, 6 Oct 2009 19:20:22 +0000 (+0000) Subject: Merged revisions 222273 via svnmerge from X-Git-Tag: 1.6.1.10-rc1~79 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8c256183cec8347292666d423d158ea904b9cae2;p=thirdparty%2Fasterisk.git Merged revisions 222273 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ........ r222273 | tilghman | 2009-10-06 14:17:11 -0500 (Tue, 06 Oct 2009) | 5 lines When we call a gosub routine, the variables should be scoped to avoid contaminating the caller. This affected the ~~EXTEN~~ hack, where a subroutine might have changed the value before it was used in the caller. Patch by myself, tested by ebroad on #asterisk ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@222282 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/res/ael/pval.c b/res/ael/pval.c index dc1678616c..5865634d88 100644 --- a/res/ael/pval.c +++ b/res/ael/pval.c @@ -3361,38 +3361,60 @@ static void gen_prios(struct ael_extension *exten, char *label, pval *statement, if (contains_switch(statement)) { /* only run contains_switch if you haven't checked before */ if (mother_exten) { if (!mother_exten->has_switch) { - switch_set = new_prio(); - switch_set->type = AEL_APPCALL; - if (!ast_compat_app_set) { - switch_set->app = strdup("MSet"); - } else { - switch_set->app = strdup("Set"); - } - switch_set->appargs = strdup("~~EXTEN~~=${EXTEN}"); - linkprio(exten, switch_set, mother_exten); - mother_exten->has_switch = 1; - mother_exten->checked_switch = 1; - if (exten) { - exten->has_switch = 1; - exten->checked_switch = 1; + for (first = 1; first >= 0; first--) { + switch_set = new_prio(); + switch_set->type = AEL_APPCALL; + if (!ast_compat_app_set) { + switch_set->app = strdup("MSet"); + } else { + switch_set->app = strdup("Set"); + } + /* Are we likely inside a gosub subroutine? */ + if (!strcmp(mother_exten->name, "s") && first) { + /* If we're not actually within a gosub, this will fail, but the + * second time through, it will get set. If we are within gosub, + * the second time through is redundant, but acceptable. */ + switch_set->appargs = strdup("LOCAL(~~EXTEN~~)=${EXTEN}"); + } else { + switch_set->appargs = strdup("~~EXTEN~~=${EXTEN}"); + first = 0; + } + linkprio(exten, switch_set, mother_exten); + mother_exten->has_switch = 1; + mother_exten->checked_switch = 1; + if (exten) { + exten->has_switch = 1; + exten->checked_switch = 1; + } } } } else if (exten) { if (!exten->has_switch) { - switch_set = new_prio(); - switch_set->type = AEL_APPCALL; - if (!ast_compat_app_set) { - switch_set->app = strdup("MSet"); - } else { - switch_set->app = strdup("Set"); - } - switch_set->appargs = strdup("~~EXTEN~~=${EXTEN}"); - linkprio(exten, switch_set, mother_exten); - exten->has_switch = 1; - exten->checked_switch = 1; - if (mother_exten) { - mother_exten->has_switch = 1; - mother_exten->checked_switch = 1; + for (first = 1; first >= 0; first--) { + switch_set = new_prio(); + switch_set->type = AEL_APPCALL; + if (!ast_compat_app_set) { + switch_set->app = strdup("MSet"); + } else { + switch_set->app = strdup("Set"); + } + /* Are we likely inside a gosub subroutine? */ + if (!strcmp(exten->name, "s")) { + /* If we're not actually within a gosub, this will fail, but the + * second time through, it will get set. If we are within gosub, + * the second time through is redundant, but acceptable. */ + switch_set->appargs = strdup("LOCAL(~~EXTEN~~)=${EXTEN}"); + } else { + switch_set->appargs = strdup("~~EXTEN~~=${EXTEN}"); + first = 0; + } + linkprio(exten, switch_set, mother_exten); + exten->has_switch = 1; + exten->checked_switch = 1; + if (mother_exten) { + mother_exten->has_switch = 1; + mother_exten->checked_switch = 1; + } } } }