aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/app_dial.c7
-rw-r--r--apps/app_queue.c11
-rw-r--r--apps/app_stack.c13
3 files changed, 23 insertions, 8 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 52d8ed31e..0021015bd 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -1832,12 +1832,15 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
if (gosub_args) {
res = pbx_exec(peer, theapp, gosub_args);
- ast_pbx_run(peer);
+ if (!res) {
+ ast_pbx_run(peer);
+ }
ast_free(gosub_args);
if (option_debug)
ast_log(LOG_DEBUG, "Gosub exited with status %d\n", res);
- } else
+ } else {
ast_log(LOG_ERROR, "Could not Allocate string for Gosub arguments -- Gosub Call Aborted!\n");
+ }
res = 0;
} else {
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 80579a11e..875943580 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -3771,7 +3771,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
gosub_args = NULL;
}
- *gosub_argstart = '|';
+ *gosub_argstart = ',';
} else {
if (asprintf(&gosub_args, "%s,s,1", gosubexec) < 0) {
ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
@@ -3780,14 +3780,15 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
}
if (gosub_args) {
res = pbx_exec(peer, app, gosub_args);
- ast_pbx_run(peer);
+ if (!res) {
+ ast_pbx_run(peer);
+ }
free(gosub_args);
if (option_debug)
ast_log(LOG_DEBUG, "Gosub exited with status %d\n", res);
- } else
+ } else {
ast_log(LOG_ERROR, "Could not Allocate string for Gosub arguments -- Gosub Call Aborted!\n");
-
- res = 0;
+ }
} else {
ast_log(LOG_ERROR, "Could not find application Gosub\n");
res = -1;
diff --git a/apps/app_stack.c b/apps/app_stack.c
index a6333d8d4..cd6ed5521 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);