]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
fixes issue with p->method incorrectly set to ACK
authorDavid Vossel <dvossel@digium.com>
Tue, 22 Dec 2009 16:58:19 +0000 (16:58 +0000)
committerDavid Vossel <dvossel@digium.com>
Tue, 22 Dec 2009 16:58:19 +0000 (16:58 +0000)
It is possible for a second ACK to come in for a retransmitted message.
If an ack does not match an unacked message in our queue, restore the previous
p->method as this ACK is completely ignored.

(closes issue #16295)
Reported by: omolenkamp
Patches:
      issue16295_v2.diff uploaded by dvossel (license 671)

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

channels/chan_sip.c

index 4f2dd61502c55774ad63705436235fb26ab29322..cb15b8cb99eba73be2eb97b873f80adb4a3ec670 100644 (file)
@@ -16387,6 +16387,8 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
        int debug = sip_debug_test_pvt(p);
        char *e;
        int error = 0;
+       int oldmethod = p->method;
+       int acked = 0;
 
        /* Get Method and Cseq */
        cseq = get_header(req, "Cseq");
@@ -16563,7 +16565,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                if (seqno == p->pendinginvite) {
                        p->invitestate = INV_TERMINATED;
                        p->pendinginvite = 0;
-                       __sip_ack(p, seqno, FLAG_RESPONSE, 0);
+                       acked = __sip_ack(p, seqno, FLAG_RESPONSE, 0);
                        if (find_sdp(req)) {
                                if (process_sdp(p, req))
                                        return -1;
@@ -16572,7 +16574,12 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                } else if (p->glareinvite == seqno) {
                        /* handle ack for the 491 pending send for glareinvite */
                        p->glareinvite = 0;
-                       __sip_ack(p, seqno, 1, 0);
+                       acked = __sip_ack(p, seqno, 1, 0);
+               }
+               if (!acked) {
+                       /* Got an ACK that did not match anything. Ignore
+                        * silently and restore previous method */
+                       p->method = oldmethod;
                }
                /* Got an ACK that we did not match. Ignore silently */
                if (!p->lastinvite && ast_strlen_zero(p->randdata))