From: Olle Johansson Date: Wed, 21 Sep 2011 09:32:50 +0000 (+0000) Subject: Make ast_pbx_run() not default to s@default if extension is not found X-Git-Tag: 10.0.0-beta2~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=725dbbab221a7f0abf4cf67b21e072be84b0c1d0;p=thirdparty%2Fasterisk.git Make ast_pbx_run() not default to s@default if extension is not found Review: https://reviewboard.asterisk.org/r/1446/ This is a bug - or architecture mistake - that has been in Asterisk for a very long time. It was exposed by the AMI originate action and possibly some other applications. Most channel drivers checks if an extension exists BEFORE starting a pbx on an inbound call, so most calls will not depend on this issue. Thanks everyone involved in the review and on IRC and the mailing list for a quick review and all the feedback. (closes issue ASTERISK-18578) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@337219 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/CHANGES b/CHANGES index 22d9ddb19d..6e623fed0b 100644 --- a/CHANGES +++ b/CHANGES @@ -220,7 +220,7 @@ Asterisk Modules IAX2 Changes ------------ -* authdebug is now disabled by default. To enable this functionaility again + * authdebug is now disabled by default. To enable this functionaility again set authdebug = yes in iax.conf. RTP Changes @@ -228,6 +228,21 @@ RTP Changes * The rtp.conf setting "strictrtp" is now enabled by default. In previous releases it was disabled. +PBX Core +-------- + * The PBX core previously made a call with a non-existing extension test for + extension s@default and jump there if the extension existed. + This was a bad default behaviour and violated the principle of least surprise. + It has therefore been changed in this release. It may affect some + applications and configurations that rely on this behaviour. Most channel + drivers have avoided this for many releases by testing whether the extension + called exists before starting the PBX and generating a local error. + This behaviour still exists and works as before. + + Extension "s" is used when no extension is given in a channel driver, + like immediate answer in DAHDI or calling to a domain with no user part + in a SIP uri. + ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 1.6.2 to Asterisk 1.8 ---------------- ------------------------------------------------------------------------------ diff --git a/configs/extensions.conf.sample b/configs/extensions.conf.sample index 31c3b7dd2d..8906845783 100644 --- a/configs/extensions.conf.sample +++ b/configs/extensions.conf.sample @@ -285,6 +285,10 @@ include => dundi-e164-switch ; In macros, it is the start extension. In most other cases, ; you have to goto "s" to execute that extension. ; +; Note: In old versions of Asterisk the PBX in some cases defaulted to +; extension "s" when a given extension was wrong (like in AMI originate). +; This is no longer the case. +; ; For wildcard matches, see above - all pattern matches start with ; an underscore. exten => s,1,Goto(${ARG1},1) diff --git a/main/pbx.c b/main/pbx.c index 09eaf09100..8d33a9d99b 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -4977,23 +4977,16 @@ static enum ast_pbx_result __ast_pbx_run(struct ast_channel *c, autoloopflag = ast_test_flag(c, AST_FLAG_IN_AUTOLOOP); /* save value to restore at the end */ ast_set_flag(c, AST_FLAG_IN_AUTOLOOP); - /* Start by trying whatever the channel is set to */ - if (!ast_exists_extension(c, c->context, c->exten, c->priority, - S_COR(c->caller.id.number.valid, c->caller.id.number.str, NULL))) { - /* If not successful fall back to 's' */ + if (ast_strlen_zero(c->exten)) { + /* If not successful fall back to 's' - but only if there is no given exten */ ast_verb(2, "Starting %s at %s,%s,%d failed so falling back to exten 's'\n", c->name, c->context, c->exten, c->priority); /* XXX the original code used the existing priority in the call to * ast_exists_extension(), and reset it to 1 afterwards. * I believe the correct thing is to set it to 1 immediately. - */ + */ set_ext_pri(c, "s", 1); - if (!ast_exists_extension(c, c->context, c->exten, c->priority, - S_COR(c->caller.id.number.valid, c->caller.id.number.str, NULL))) { - /* JK02: And finally back to default if everything else failed */ - ast_verb(2, "Starting %s at %s,%s,%d still failed so falling back to context 'default'\n", c->name, c->context, c->exten, c->priority); - ast_copy_string(c->context, "default", sizeof(c->context)); - } } + if (c->cdr) { /* allow CDR variables that have been collected after channel was created to be visible during call */ ast_cdr_update(c);