Fix broken reinvite glare scenario.
[asterisk/asterisk.git] / channels / chan_sip.c
index 29b92a5..f6fb2af 100644 (file)
@@ -23208,9 +23208,7 @@ 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;
@@ -23230,7 +23228,6 @@ 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 */
@@ -23250,7 +23247,6 @@ 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;
@@ -23355,7 +23351,6 @@ 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;
@@ -26208,13 +26203,13 @@ static int handle_incoming(struct sip_pvt *p, struct sip_request *req, struct as
                        if (!req->ignore && req->method == SIP_INVITE) {
                                transmit_response_reliable(p, "481 Call/Transaction Does Not Exist", req);
                                /* Will cease to exist after ACK */
+                               return res;
                        } else if (req->method != SIP_ACK) {
                                transmit_response(p, "481 Call/Transaction Does Not Exist", req);
                                sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
-                       } else {
-                               ast_debug(1, "Got ACK for unknown dialog... strange.\n");
+                               return res;
                        }
-                       return res;
+                       /* Otherwise, this is an ACK. It will always have a to-tag */
                }
        }