mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-29 15:36:13 +00:00 
			
		
		
		
	Merged revisions 9156 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r9156 | tilghman | 2006-02-05 11:10:19 -0600 (Sun, 05 Feb 2006) | 2 lines Bug 6176 - Fix race condition ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@9157 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -107,7 +107,7 @@ static int macro_exec(struct ast_channel *chan, void *data) | |||||||
| 	char oldcontext[AST_MAX_CONTEXT] = ""; | 	char oldcontext[AST_MAX_CONTEXT] = ""; | ||||||
| 	int offset, depth = 0; | 	int offset, depth = 0; | ||||||
| 	int setmacrocontext=0; | 	int setmacrocontext=0; | ||||||
| 	int autoloopflag; | 	int autoloopflag, dead = 0; | ||||||
|    |    | ||||||
| 	char *save_macro_exten; | 	char *save_macro_exten; | ||||||
| 	char *save_macro_context; | 	char *save_macro_context; | ||||||
| @@ -223,6 +223,7 @@ static int macro_exec(struct ast_channel *chan, void *data) | |||||||
| 					ast_log(LOG_DEBUG, "Spawn extension (%s,%s,%d) exited non-zero on '%s' in macro '%s'\n", chan->context, chan->exten, chan->priority, chan->name, macro); | 					ast_log(LOG_DEBUG, "Spawn extension (%s,%s,%d) exited non-zero on '%s' in macro '%s'\n", chan->context, chan->exten, chan->priority, chan->name, macro); | ||||||
| 				else if (option_verbose > 1) | 				else if (option_verbose > 1) | ||||||
| 					ast_verbose( VERBOSE_PREFIX_2 "Spawn extension (%s, %s, %d) exited non-zero on '%s' in macro '%s'\n", chan->context, chan->exten, chan->priority, chan->name, macro); | 					ast_verbose( VERBOSE_PREFIX_2 "Spawn extension (%s, %s, %d) exited non-zero on '%s' in macro '%s'\n", chan->context, chan->exten, chan->priority, chan->name, macro); | ||||||
|  | 				dead = 1; | ||||||
| 				goto out; | 				goto out; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @@ -242,37 +243,44 @@ static int macro_exec(struct ast_channel *chan, void *data) | |||||||
| 	out: | 	out: | ||||||
| 	/* Reset the depth back to what it was when the routine was entered (like if we called Macro recursively) */ | 	/* Reset the depth back to what it was when the routine was entered (like if we called Macro recursively) */ | ||||||
| 	snprintf(depthc, sizeof(depthc), "%d", depth); | 	snprintf(depthc, sizeof(depthc), "%d", depth); | ||||||
|  | 	if (!dead) { | ||||||
| 		pbx_builtin_setvar_helper(chan, "MACRO_DEPTH", depthc); | 		pbx_builtin_setvar_helper(chan, "MACRO_DEPTH", depthc); | ||||||
|  |  | ||||||
| 		ast_set2_flag(chan, autoloopflag, AST_FLAG_IN_AUTOLOOP); | 		ast_set2_flag(chan, autoloopflag, AST_FLAG_IN_AUTOLOOP); | ||||||
|   	for (x=1; x<argc; x++) { | 	} | ||||||
|  |  | ||||||
|  |   	for (x = 1; x < argc; x++) { | ||||||
|   		/* Restore old arguments and delete ours */ |   		/* Restore old arguments and delete ours */ | ||||||
| 		snprintf(varname, sizeof(varname), "ARG%d", x); | 		snprintf(varname, sizeof(varname), "ARG%d", x); | ||||||
|   		if (oldargs[x]) { |   		if (oldargs[x]) { | ||||||
|  | 			if (!dead) | ||||||
| 				pbx_builtin_setvar_helper(chan, varname, oldargs[x]); | 				pbx_builtin_setvar_helper(chan, varname, oldargs[x]); | ||||||
| 			free(oldargs[x]); | 			free(oldargs[x]); | ||||||
| 		} else { | 		} else if (!dead) { | ||||||
| 			pbx_builtin_setvar_helper(chan, varname, NULL); | 			pbx_builtin_setvar_helper(chan, varname, NULL); | ||||||
| 		} | 		} | ||||||
|   	} |   	} | ||||||
|  |  | ||||||
| 	/* Restore macro variables */ | 	/* Restore macro variables */ | ||||||
|  | 	if (!dead) { | ||||||
| 		pbx_builtin_setvar_helper(chan, "MACRO_EXTEN", save_macro_exten); | 		pbx_builtin_setvar_helper(chan, "MACRO_EXTEN", save_macro_exten); | ||||||
|  | 		pbx_builtin_setvar_helper(chan, "MACRO_CONTEXT", save_macro_context); | ||||||
|  | 		pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority); | ||||||
|  | 	} | ||||||
| 	if (save_macro_exten) | 	if (save_macro_exten) | ||||||
| 		free(save_macro_exten); | 		free(save_macro_exten); | ||||||
| 	pbx_builtin_setvar_helper(chan, "MACRO_CONTEXT", save_macro_context); |  | ||||||
| 	if (save_macro_context) | 	if (save_macro_context) | ||||||
| 		free(save_macro_context); | 		free(save_macro_context); | ||||||
| 	pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority); |  | ||||||
| 	if (save_macro_priority) | 	if (save_macro_priority) | ||||||
| 		free(save_macro_priority); | 		free(save_macro_priority); | ||||||
| 	if (setmacrocontext) { |  | ||||||
|  | 	if (!dead && setmacrocontext) { | ||||||
| 		chan->macrocontext[0] = '\0'; | 		chan->macrocontext[0] = '\0'; | ||||||
| 		chan->macroexten[0] = '\0'; | 		chan->macroexten[0] = '\0'; | ||||||
| 		chan->macropriority = 0; | 		chan->macropriority = 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (!strcasecmp(chan->context, fullmacro)) { | 	if (!dead && !strcasecmp(chan->context, fullmacro)) { | ||||||
|   		/* If we're leaving the macro normally, restore original information */ |   		/* If we're leaving the macro normally, restore original information */ | ||||||
| 		chan->priority = oldpriority; | 		chan->priority = oldpriority; | ||||||
| 		ast_copy_string(chan->context, oldcontext, sizeof(chan->context)); | 		ast_copy_string(chan->context, oldcontext, sizeof(chan->context)); | ||||||
| @@ -292,6 +300,7 @@ static int macro_exec(struct ast_channel *chan, void *data) | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if (!dead) | ||||||
| 		pbx_builtin_setvar_helper(chan, "MACRO_OFFSET", save_macro_offset); | 		pbx_builtin_setvar_helper(chan, "MACRO_OFFSET", save_macro_offset); | ||||||
| 	if (save_macro_offset) | 	if (save_macro_offset) | ||||||
| 		free(save_macro_offset); | 		free(save_macro_offset); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user