From: Kinsey Moore Date: Mon, 5 Mar 2012 15:59:46 +0000 (+0000) Subject: Ensure Asterisk acknowledges ACKs to 4xx on Replaces errors X-Git-Tag: 10.3.0~65 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7c8651f06a278ce76e2213c7df169aaaf818f28;p=thirdparty%2Fasterisk.git Ensure Asterisk acknowledges ACKs to 4xx on Replaces errors 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 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 977c62d2f2..0d0f9992bb 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -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; } }