[svn-commits] tilghman: branch 1.6.0 r229352 - in /branches/1.6.0: ./ apps/app_stack.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Nov 10 15:31:24 CST 2009


Author: tilghman
Date: Tue Nov 10 15:31:20 2009
New Revision: 229352

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=229352
Log:
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
........

Modified:
    branches/1.6.0/   (props changed)
    branches/1.6.0/apps/app_stack.c

Propchange: branches/1.6.0/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.

Modified: branches/1.6.0/apps/app_stack.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.0/apps/app_stack.c?view=diff&rev=229352&r1=229351&r2=229352
==============================================================================
--- branches/1.6.0/apps/app_stack.c (original)
+++ branches/1.6.0/apps/app_stack.c Tue Nov 10 15:31:20 2009
@@ -83,6 +83,7 @@
 	unsigned char arguments;
 	struct varshead varshead;
 	int priority;
+	unsigned int is_agi:1;
 	char *context;
 	char extension[0];
 };
@@ -195,6 +196,7 @@
 	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 @@
 	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 @@
 
 	/* 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 @@
 		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 */




More information about the svn-commits mailing list