diff options
-rw-r--r-- | apps/app_dial.c | 7 | ||||
-rw-r--r-- | apps/app_queue.c | 11 | ||||
-rw-r--r-- | apps/app_stack.c | 13 |
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); |