diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-11-10 21:31:20 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-11-10 21:31:20 +0000 |
commit | 787d08d034bfd1e4de0c9185a4465e73397f0e3b (patch) | |
tree | 658a3faed5cca9617990d988d1406f7d54705ef8 /apps/app_stack.c | |
parent | d8947e46e804e4b01b1d35164ec6ad22492d4c3e (diff) |
Merged revisions 229351 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r229351 | tilghman | 2009-11-10 15:22:50 -0600 (Tue, 10 Nov 2009) | 7 lines
When GOSUB is invoked within an AGI, it may not exit correctly.
(closes issue #16216)
Reported by: atis
Patches:
20091110__atis_work.diff.txt uploaded by tilghman (license 14)
Tested by: atis
........
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@229352 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_stack.c')
-rw-r--r-- | apps/app_stack.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/apps/app_stack.c b/apps/app_stack.c index 7087ef503..2fe072770 100644 --- a/apps/app_stack.c +++ b/apps/app_stack.c @@ -83,6 +83,7 @@ struct gosub_stack_frame { unsigned char arguments; struct varshead varshead; int priority; + unsigned int is_agi:1; char *context; char extension[0]; }; @@ -195,6 +196,7 @@ static int return_exec(struct ast_channel *chan, void *data) struct gosub_stack_frame *oldframe; AST_LIST_HEAD(, gosub_stack_frame) *oldlist; char *retval = data; + int res = 0; if (!stack_store) { ast_log(LOG_ERROR, "Return without Gosub: stack is unallocated\n"); @@ -209,6 +211,9 @@ static int return_exec(struct ast_channel *chan, void *data) if (!oldframe) { ast_log(LOG_ERROR, "Return without Gosub: stack is empty\n"); return -1; + } else if (oldframe->is_agi) { + /* Exit from AGI */ + res = -1; } ast_explicit_goto(chan, oldframe->context, oldframe->extension, oldframe->priority); @@ -216,7 +221,7 @@ static int return_exec(struct ast_channel *chan, void *data) /* Set a return value, if any */ pbx_builtin_setvar_helper(chan, "GOSUB_RETVAL", S_OR(retval, "")); - return 0; + return res; } static int gosub_exec(struct ast_channel *chan, void *data) @@ -469,6 +474,11 @@ static int handle_gosub(struct ast_channel *chan, AGI *agi, int argc, char **arg if ((res = pbx_exec(chan, theapp, gosub_args)) == 0) { struct ast_pbx *pbx = chan->pbx; struct ast_pbx_args args; + struct ast_datastore *stack_store = ast_channel_datastore_find(chan, &stack_info, NULL); + AST_LIST_HEAD(, gosub_stack_frame) *oldlist = stack_store->data; + struct gosub_stack_frame *cur = AST_LIST_FIRST(oldlist); + cur->is_agi = 1; + memset(&args, 0, sizeof(args)); args.no_hangup_chan = 1; /* Suppress warning about PBX already existing */ |