]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 229351 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 10 Nov 2009 21:31:35 +0000 (21:31 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 10 Nov 2009 21:31:35 +0000 (21:31 +0000)
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: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@229353 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_stack.c

index 743113b6b94a7e3f3a8ecbe6844a5c801af24db0..c326a7486922e002801bae0e189b4cad80792497 100644 (file)
@@ -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 */