From 3ad7d2f36ca155e6ee823a48175e5951829e1a20 Mon Sep 17 00:00:00 2001 From: Sean Bright <sean.bright@gmail.com> Date: Tue, 10 Oct 2017 13:01:05 -0400 Subject: [PATCH] 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 --- apps/app_originate.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/apps/app_originate.c b/apps/app_originate.c index 8edccc720f..30fa565bea 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) -- GitLab