Index: apps/app_stack.c =================================================================== --- apps/app_stack.c (revision 244242) +++ apps/app_stack.c (working copy) @@ -346,7 +346,8 @@ AST_LIST_HEAD(, gosub_stack_frame) *oldlist; struct gosub_stack_frame *newframe; char argname[15], *tmp = ast_strdupa(data), *label, *endparen; - int i; + const char *prev_argc; + int i, max_argc = 0; AST_DECLARE_APP_ARGS(args2, AST_APP_ARG(argval)[100]; ); @@ -412,14 +413,25 @@ return -1; } + ast_channel_lock(chan); + if ((prev_argc = pbx_builtin_getvar_helper(chan, "~ARGC~"))) { + max_argc = atoi(prev_argc); + } + ast_channel_unlock(chan); + if (args2.argc > max_argc) { + max_argc = args2.argc; + } + /* Now that we know for certain that we're going to a new location, set our arguments */ - for (i = 0; i < args2.argc; i++) { + for (i = 0; i < max_argc; i++) { snprintf(argname, sizeof(argname), "ARG%d", i + 1); - frame_set_var(chan, newframe, argname, args2.argval[i]); - ast_debug(1, "Setting '%s' to '%s'\n", argname, args2.argval[i]); + frame_set_var(chan, newframe, argname, i < args2.argc ? args2.argval[i] : ""); + ast_debug(1, "Setting '%s' to '%s'\n", argname, i < args2.argc ? args2.argval[i] : ""); } snprintf(argname, sizeof(argname), "%d", args2.argc); frame_set_var(chan, newframe, "ARGC", argname); + snprintf(argname, sizeof(argname), "%d", max_argc); + frame_set_var(chan, newframe, "~ARGC~", argname); /* And finally, save our return address */ oldlist = stack_store->data;