Skip to content
Snippets Groups Projects
Commit 3ad7d2f3 authored by Sean Bright's avatar Sean Bright
Browse files

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
parent 6fc222a1
No related branches found
No related tags found
Loading
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment