aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_stack.c
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-03 18:42:01 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-03 18:42:01 +0000
commit3e79e0fd609993faa29efba39010bf7c1b01b2ee (patch)
tree4b00066f8a3486ff07646cd362ad220b0fac9518 /apps/app_stack.c
parentf9854b0cdf174c4553d0fe6a5db73006f5b9e6ed (diff)
Merged revisions 160626 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r160626 | mmichelson | 2008-12-03 12:37:46 -0600 (Wed, 03 Dec 2008) | 16 lines Add some safety measures when using gosub, especially when using the options for app_dial and app_queue to run a gosub when the call is answered. * Check for the existence of the gosub target in gosub_exec. If it is nonexistent, then this will cause errors when we attempt to actually run the gosub, including a definite memory leak and potential crashes. Return an error in this situation * Check the return value of pbx_exec in app_dial and app_queue before attempting to actually run the gosub routine. If there was an error, we should not attempt to run the gosub. * Change a '|' to a ',' in app_queue. * Add some extra curly braces where they had been missing previously. (closes issue #13548) Reported by: fiddur ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@160628 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_stack.c')
-rw-r--r--apps/app_stack.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/apps/app_stack.c b/apps/app_stack.c
index a5763a9b2..e890f338a 100644
--- a/apps/app_stack.c
+++ b/apps/app_stack.c
@@ -272,8 +272,9 @@ static int gosub_exec(struct ast_channel *chan, void *data)
/* Create the return address, but don't save it until we know that the Gosub destination exists */
newframe = gosub_allocate_frame(chan->context, chan->exten, chan->priority + 1, args2.argc);
- if (!newframe)
+ if (!newframe) {
return -1;
+ }
if (ast_parseable_goto(chan, label)) {
ast_log(LOG_ERROR, "Gosub address is invalid: '%s'\n", (char *)data);
@@ -281,6 +282,16 @@ static int gosub_exec(struct ast_channel *chan, void *data)
return -1;
}
+ if (!ast_exists_extension(chan, chan->context, chan->exten, chan->priority, chan->cid.cid_num)) {
+ ast_log(LOG_ERROR, "Attempt to reach a non-existent destination for gosub: (Context:%s, Extension:%s, Priority:%d)\n",
+ chan->context, chan->exten, chan->priority);
+ ast_copy_string(chan->context, newframe->context, sizeof(chan->context));
+ ast_copy_string(chan->exten, newframe->extension, sizeof(chan->exten));
+ chan->priority = newframe->priority;
+ ast_free(newframe);
+ return -1;
+ }
+
/* Now that we know for certain that we're going to a new location, set our arguments */
for (i = 0; i < args2.argc; i++) {
snprintf(argname, sizeof(argname), "ARG%d", i + 1);