ignore CANCEL request after having already received final response to INVITE
authorDavid Vossel <dvossel@digium.com>
Tue, 22 Jun 2010 20:37:05 +0000 (20:37 +0000)
committerDavid Vossel <dvossel@digium.com>
Tue, 22 Jun 2010 20:37:05 +0000 (20:37 +0000)
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

index 60ab323..fa03d9c 100644 (file)
@@ -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 --