mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	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/trunk@229351 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -199,6 +199,7 @@ struct gosub_stack_frame { | ||||
| 	unsigned char arguments; | ||||
| 	struct varshead varshead; | ||||
| 	int priority; | ||||
| 	unsigned int is_agi:1; | ||||
| 	char *context; | ||||
| 	char extension[0]; | ||||
| }; | ||||
| @@ -311,6 +312,7 @@ static int return_exec(struct ast_channel *chan, const char *data) | ||||
| 	struct gosub_stack_frame *oldframe; | ||||
| 	AST_LIST_HEAD(, gosub_stack_frame) *oldlist; | ||||
| 	const char *retval = data; | ||||
| 	int res = 0; | ||||
|  | ||||
| 	if (!stack_store) { | ||||
| 		ast_log(LOG_ERROR, "Return without Gosub: stack is unallocated\n"); | ||||
| @@ -325,6 +327,9 @@ static int return_exec(struct ast_channel *chan, const char *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); | ||||
| @@ -332,7 +337,7 @@ static int return_exec(struct ast_channel *chan, const char *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, const char *data) | ||||
| @@ -619,6 +624,11 @@ static int handle_gosub(struct ast_channel *chan, AGI *agi, int argc, const char | ||||
| 		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 */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user