]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Make sure we don't cancel destruction on calls in CANCEL state, even if we
authorOlle Johansson <oej@edvina.net>
Wed, 23 Jan 2008 20:58:20 +0000 (20:58 +0000)
committerOlle Johansson <oej@edvina.net>
Wed, 23 Jan 2008 20:58:20 +0000 (20:58 +0000)
get 183 while waiting for answer on our CANCEL.

(issue #11736)
Reported by: MVF
Patches:
      bug11736.txt uploaded by oej (license 306)
Tested by: MVF

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

channels/chan_sip.c

index 779633b3d2c3dc2619cee0ba0a8f28cba6a809a5..2ed95f926b9c53f9ba859e5402147e611d6f7672 100644 (file)
@@ -3547,6 +3547,7 @@ static int sip_hangup(struct ast_channel *ast)
                        if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
                                /* stop retransmitting an INVITE that has not received a response */
                                __sip_pretend_ack(p);
+                               p->invitestate = INV_CANCELLED;
 
                                /* if we can't send right now, mark it pending */
                                if (p->invitestate == INV_CALLING) {
@@ -3562,7 +3563,6 @@ static int sip_hangup(struct ast_channel *ast)
                                           INVITE, but do set an autodestruct just in case we never get it. */
                                        needdestroy = 0;
                                        sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
-                                       p->invitestate = INV_CANCELLED;
                                }
                                if ( p->initid != -1 ) {
                                        /* channel still up - reverse dec of inUse counter
@@ -12026,14 +12026,14 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
        switch (resp) {
        case 100:       /* Trying */
        case 101:       /* Dialog establishment */
-               if (!ast_test_flag(req, SIP_PKT_IGNORE))
+               if (!ast_test_flag(req, SIP_PKT_IGNORE) && (p->invitestate != INV_CANCELLED))
                        sip_cancel_destroy(p);
                check_pendings(p);
                break;
 
        case 180:       /* 180 Ringing */
        case 182:       /* 182 Queued */
-               if (!ast_test_flag(req, SIP_PKT_IGNORE))
+               if (!ast_test_flag(req, SIP_PKT_IGNORE) && (p->invitestate != INV_CANCELLED))
                        sip_cancel_destroy(p);
                if (!ast_test_flag(req, SIP_PKT_IGNORE) && p->owner) {
                        ast_queue_control(p->owner, AST_CONTROL_RINGING);
@@ -12053,7 +12053,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                break;
 
        case 183:       /* Session progress */
-               if (!ast_test_flag(req, SIP_PKT_IGNORE))
+               if (!ast_test_flag(req, SIP_PKT_IGNORE) && (p->invitestate != INV_CANCELLED))
                        sip_cancel_destroy(p);
                /* Ignore 183 Session progress without SDP */
                if (find_sdp(req)) {
@@ -12068,7 +12068,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                break;
 
        case 200:       /* 200 OK on invite - someone's answering our call */
-               if (!ast_test_flag(req, SIP_PKT_IGNORE))
+               if (!ast_test_flag(req, SIP_PKT_IGNORE) && (p->invitestate != INV_CANCELLED))
                        sip_cancel_destroy(p);
                p->authtries = 0;
                if (find_sdp(req)) {