]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Inspect Require header on BYE transaction according to RFC3261 section 8.2.2.3.
authorDavid Vossel <dvossel@digium.com>
Fri, 24 Sep 2010 17:05:12 +0000 (17:05 +0000)
committerDavid Vossel <dvossel@digium.com>
Fri, 24 Sep 2010 17:05:12 +0000 (17:05 +0000)
ABE-2293

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

channels/chan_sip.c

index 11473b5de84971046f2f2411f9562fb86009171e..f3d2c2f036144ee085a5d1373d703a43a3e8e8fe 100644 (file)
@@ -22252,7 +22252,8 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req)
        struct ast_channel *c=NULL;
        int res;
        struct ast_channel *bridged_to;
-       
+       const char *required;
+
        /* If we have an INCOMING invite that we haven't answered, terminate that transaction */
        if (p->pendinginvite && !ast_test_flag(&p->flags[0], SIP_OUTGOING) && !req->ignore) {
                transmit_response_reliable(p, "487 Request Terminated", &p->initreq);
@@ -22373,7 +22374,23 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req)
                ast_debug(3, "Received bye, no owner, selfdestruct soon.\n");
        }
        ast_clear_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED);
-       transmit_response(p, "200 OK", req);
+
+       /* Find out what they require */
+       required = get_header(req, "Require");
+       if (!ast_strlen_zero(required)) {
+               char unsupported[256] = { 0, };
+               parse_sip_options(required, unsupported, ARRAY_LEN(unsupported));
+               /* If there are any options required that we do not support,
+                * then send a 420 with only those unsupported options listed */
+               if (!ast_strlen_zero(unsupported)) {
+                       transmit_response_with_unsupported(p, "420 Bad extension (unsupported)", req, unsupported);
+                       ast_log(LOG_WARNING, "Received SIP BYE with unsupported required extension: required:%s unsupported:%s\n", required, unsupported);
+               } else {
+                       transmit_response(p, "200 OK", req);
+               }
+       } else {
+               transmit_response(p, "200 OK", req);
+       }
 
        return 1;
 }