aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_stack.c
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2009-11-10 21:31:35 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2009-11-10 21:31:35 +0000
commit7d28891f0049486ea393679348514374c5ad9823 (patch)
treeede75d66fecd2f1e9e7fb9c43d75696304da8b8a /apps/app_stack.c
parent06285400a47f75d27d8c50f22e3db7a0187e177f (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.1@229353 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_stack.c')
-rw-r--r--apps/app_stack.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/apps/app_stack.c b/apps/app_stack.c
index 743113b6b..c326a7486 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 */