]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Ensure Asterisk acknowledges ACKs to 4xx on Replaces errors
authorKinsey Moore <kmoore@digium.com>
Mon, 5 Mar 2012 15:59:46 +0000 (15:59 +0000)
committerKinsey Moore <kmoore@digium.com>
Mon, 5 Mar 2012 15:59:46 +0000 (15:59 +0000)
Asterisk was not setting pendinginvite in the upper half of
handle_request_invite such that the 4xx was retransmitted repeatedly even
though an ack was received for every retransmission.

(closes issue ASTERISK-19303)
Reported by: Jon Tsiros
Patches:
  fix-19303.patch uploaded by Jeremiah Gowdy (license 6358)

........

Merged revisions 358115 from http://svn.asterisk.org/svn/asterisk/branches/1.8

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

channels/chan_sip.c

index 977c62d2f24794a393076993978ea297c88f0344..0d0f9992bbc442d30fd148eaa21d3e9f9bc8d20c 100644 (file)
@@ -22974,6 +22974,9 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                }
                        }
                        transmit_response_reliable(p, "491 Request Pending", req);
+                       p->pendinginvite = seqno;
+                       check_via(p, req);
+                       copy_request(&p->initreq, req);
                        ast_debug(1, "Got INVITE on call where we already have pending INVITE, deferring that - %s\n", p->callid);
                        /* Don't destroy dialog here */
                        res = INV_REQ_FAILED;
@@ -22993,6 +22996,9 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                if (p->owner) {
                        ast_debug(3, "INVITE w Replaces on existing call? Refusing action. [%s]\n", p->callid);
                        transmit_response_reliable(p, "400 Bad request", req);  /* The best way to not not accept the transfer */
+                       p->pendinginvite = seqno;
+                       check_via(p, req);
+                       copy_request(&p->initreq, req);
                        /* Do not destroy existing call */
                        res = INV_REQ_ERROR;
                        goto request_invite_cleanup;
@@ -23010,6 +23016,9 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                        p->invitestate = INV_COMPLETED;
                        res = INV_REQ_ERROR;
+                       p->pendinginvite = seqno;
+                       check_via(p, req);
+                       copy_request(&p->initreq, req);
                        goto request_invite_cleanup;
                }
 
@@ -23111,6 +23120,9 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        refer_locked = 0;
                        p->invitestate = INV_COMPLETED;
                        res = INV_REQ_ERROR;
+                       p->pendinginvite = seqno;
+                       check_via(p, req);
+                       copy_request(&p->initreq, req);
                        goto request_invite_cleanup;
                }
        }