diff options
author | Sean Bright <sean.bright@gmail.com> | 2017-10-10 13:01:05 -0400 |
---|---|---|
committer | Sean Bright <sean.bright@gmail.com> | 2017-10-10 13:25:21 -0400 |
commit | 9acfcefbd32ad96a80cc46b77c28961f18ecae0d (patch) | |
tree | eb7fc5969df8fb79a3bd77c880824bb65180319f /apps | |
parent | bc76eb294fa4c3397f689f4d7472929a699cf8e3 (diff) |
app_originate: Set ORIGINATE_STATUS correctly on failure
We were ignoring the return value from ast_pbx_outgoing_exten() and
ast_pbx_outgoing_app() which could fail before setting the reason code.
This resulted in failures being reported as success.
ASTERISK-25266 #close
Reported by: Allen Ford
Change-Id: Idf16237b7e41b527d2c69c865829128686beeb3b
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_originate.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/apps/app_originate.c b/apps/app_originate.c index 8edccc720..30fa565be 100644 --- a/apps/app_originate.c +++ b/apps/app_originate.c @@ -155,6 +155,7 @@ static int originate_exec(struct ast_channel *chan, const char *data) char *parse; char *chantech, *chandata; int res = -1; + int continue_in_dialplan = 0; int outgoing_status = 0; unsigned int timeout = 30; static const char default_exten[] = "s"; @@ -223,6 +224,12 @@ static int originate_exec(struct ast_channel *chan, const char *data) predial_callee = opt_args[OPT_ARG_PREDIAL_CALLEE]; } + if (strcasecmp(args.type, "exten") && strcasecmp(args.type, "app")) { + ast_log(LOG_ERROR, "Incorrect type, it should be 'exten' or 'app': %s\n", + args.type); + goto return_cleanup; + } + if (!strcasecmp(args.type, "exten")) { int priority = 1; /* Initialized in case priority not specified */ const char *exten = args.arg2; @@ -241,25 +248,32 @@ static int originate_exec(struct ast_channel *chan, const char *data) ast_debug(1, "Originating call to '%s/%s' and connecting them to extension %s,%s,%d\n", chantech, chandata, args.arg1, exten, priority); - ast_pbx_outgoing_exten_predial(chantech, cap_slin, chandata, + res = ast_pbx_outgoing_exten_predial(chantech, cap_slin, chandata, timeout * 1000, args.arg1, exten, priority, &outgoing_status, AST_OUTGOING_WAIT, NULL, NULL, NULL, NULL, NULL, 0, NULL, predial_callee); - } else if (!strcasecmp(args.type, "app")) { + } else { ast_debug(1, "Originating call to '%s/%s' and connecting them to %s(%s)\n", chantech, chandata, args.arg1, S_OR(args.arg2, "")); - ast_pbx_outgoing_app_predial(chantech, cap_slin, chandata, + res = ast_pbx_outgoing_app_predial(chantech, cap_slin, chandata, timeout * 1000, args.arg1, args.arg2, &outgoing_status, AST_OUTGOING_WAIT, NULL, NULL, NULL, NULL, NULL, NULL, predial_callee); - } else { - ast_log(LOG_ERROR, "Incorrect type, it should be 'exten' or 'app': %s\n", - args.type); - goto return_cleanup; } - res = 0; + /* + * Getting here means that we have passed the various validation checks and + * have at least attempted the dial. If we have a reason (outgoing_status), + * we clear our error indicator so that we ultimately report the right thing + * to the caller. + */ + if (res && outgoing_status) { + res = 0; + } + + /* We need to exit cleanly if we've gotten this far */ + continue_in_dialplan = 1; return_cleanup: if (res) { @@ -292,7 +306,7 @@ return_cleanup: ao2_cleanup(cap_slin); ast_autoservice_stop(chan); - return res; + return continue_in_dialplan ? 0 : -1; } static int unload_module(void) |