]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Make ast_pbx_run() not default to s@default if extension is not found
authorOlle Johansson <oej@edvina.net>
Wed, 21 Sep 2011 09:32:50 +0000 (09:32 +0000)
committerOlle Johansson <oej@edvina.net>
Wed, 21 Sep 2011 09:32:50 +0000 (09:32 +0000)
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

CHANGES
configs/extensions.conf.sample
main/pbx.c

diff --git a/CHANGES b/CHANGES
index 22d9ddb19dbb3907071c040f87d45615a1b7ed1c..6e623fed0b5ec129a3164cc46f40d54435a54bc2 100644 (file)
--- 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 ----------------
 ------------------------------------------------------------------------------
index 31c3b7dd2db81a944a436ac66bf5c0cbf3be7b6a..89068457837d7e040887f7bac00348376cca77de 100644 (file)
@@ -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)
index 09eaf091001efc3cbd0a9f9d2cdacb1b55fd8b33..8d33a9d99bcf97d83be20dfa694b2a2258d58c28 100644 (file)
@@ -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);