From 1509737580b7786504df2a1f1840536b8f1641a5 Mon Sep 17 00:00:00 2001
From: David Vossel <dvossel@digium.com>
Date: Tue, 22 Jun 2010 20:37:05 +0000
Subject: [PATCH] ignore CANCEL request after having already received final
 response to INVITE

RFC 3261 section 9 states that a CANCEL has no effect on a
request to a UAS that has already given a final response.  This
patch checks to make sure there is a pending invite before
allowing a CANCEL request to be processed, otherwise it responds
to the CANCEL with a "481 Call/Transaction Does Not Exist".

Review: https://reviewboard.asterisk.org/r/697/



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@271977 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_sip.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 60ab323f07..fa03d9c43b 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -23079,7 +23079,14 @@ static int handle_incoming(struct sip_pvt *p, struct sip_request *req, struct so
 		req->ignore = 1;
 		ast_debug(3, "Ignoring SIP message because of retransmit (%s Seqno %d, ours %d)\n", sip_methods[p->method].text, p->icseq, seqno);
 	}
-		
+
+	/* RFC 3261 section 9. "CANCEL has no effect on a request to which a UAS has
+	 * already given a final response." */
+	if (!p->pendinginvite && (req->method == SIP_CANCEL)) {
+		transmit_response(p, "481 Call/Transaction Does Not Exist", req);
+		return res;
+	}
+
 	if (seqno >= p->icseq)
 		/* Next should follow monotonically (but not necessarily
 		   incrementally -- thanks again to the genius authors of SIP --
-- 
GitLab