]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
pbx: Make originate threads indicate dial status when synchronous
authorJonathan Rose <jrose@digium.com>
Fri, 9 Aug 2013 17:28:15 +0000 (17:28 +0000)
committerJonathan Rose <jrose@digium.com>
Fri, 9 Aug 2013 17:28:15 +0000 (17:28 +0000)
This makes it so that we can detect failures to originate as with
earlier versions of Asterisk, which restores the Asterisk 11 behavior
for the originate manager action. This was causing the ACL tests for
SIP and IAX2 to fail since those tests expected originate failures
when ACLs would cause rejections. Also, this patch fixes crashes in
chan_sip when ACLs rejected peers during registration verification.

(closes issue ASTERISK-22212)
Reported by: Matt Jordan
Review: https://reviewboard.asterisk.org/r/2753/

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@396498 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
main/pbx.c

index c02f022eff70fcaa4b4593f67d550ac93065dcca..51eaef2f82d170196227372ce3e90a2290266d14 100644 (file)
@@ -17345,7 +17345,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
                        break;
                }
 
-               if (peer->endpoint) {
+               if (peer && peer->endpoint) {
                        ast_endpoint_blob_publish(peer->endpoint, ast_endpoint_state_type(), blob);
                }
        }
index 4c95b278ff7b7d3f827986610cce409819dbbac5..ec96344cbb2b0a29b29e1e8b475abab31facb3a0 100644 (file)
@@ -9776,6 +9776,8 @@ struct pbx_outgoing {
        char exten[AST_MAX_EXTENSION];
        /*! \brief Dialplan priority */
        int priority;
+       /*! \brief Result of the dial operation when dialed is set */
+       int dial_res;
        /*! \brief Set when dialing is completed */
        unsigned int dialed:1;
        /*! \brief Set when execution is completed */
@@ -9806,6 +9808,7 @@ static void *pbx_outgoing_exec(void *data)
        /* Notify anyone interested that dialing is complete */
        ast_mutex_lock(&outgoing->lock);
        res = ast_dial_run(outgoing->dial, NULL, 0);
+       outgoing->dial_res = res;
        outgoing->dialed = 1;
        ast_cond_signal(&outgoing->cond);
        ast_mutex_unlock(&outgoing->lock);
@@ -9978,6 +9981,11 @@ static int pbx_outgoing_attempt(const char *type, struct ast_format_cap *cap, co
                }
                while (!outgoing->dialed) {
                        ast_cond_wait(&outgoing->cond, &outgoing->lock);
+
+                       if (outgoing->dial_res != AST_DIAL_RESULT_ANSWERED) {
+                               /* The dial operation failed. */
+                               return -1;
+                       }
                }
                if (channel && *channel) {
                        ast_channel_lock(*channel);