]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix parsing of SIP headers where compact and non-compact headers are mixed
authorKinsey Moore <kmoore@digium.com>
Thu, 9 Feb 2012 20:49:59 +0000 (20:49 +0000)
committerKinsey Moore <kmoore@digium.com>
Thu, 9 Feb 2012 20:49:59 +0000 (20:49 +0000)
Change parsing of SIP headers so that compactness of the header no longer
influences which header will be chosen.  Previously, a non-compact header
would be chosen instead of a preceeding compact-form header.

(closes issue ASTERISK-17192)
Review: https://reviewboard.asterisk.org/r/1728/

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

channels/chan_sip.c

index 43e826d650b040d0fa5bb07e422c2d6c7cd2efd6..4b6122023ec089d4dbaf897e03d26825d26e7e29 100644 (file)
@@ -7331,8 +7331,6 @@ static const char *find_alias(const char *name, const char *_default)
 
 static const char *__get_header(const struct sip_request *req, const char *name, int *start)
 {
-       int pass;
-
        /*
         * Technically you can place arbitrary whitespace both before and after the ':' in
         * a header, although RFC3261 clearly says you shouldn't before, and place just
@@ -7342,23 +7340,26 @@ static const char *__get_header(const struct sip_request *req, const char *name,
         * Anyways, pedanticsipchecking controls whether we allow spaces before ':',
         * and we always allow spaces after that for compatibility.
         */
-       for (pass = 0; name && pass < 2;pass++) {
-               int x, len = strlen(name);
-               for (x = *start; x < req->headers; x++) {
-                       const char *header = REQ_OFFSET_TO_STR(req, header[x]);
-                       if (!strncasecmp(header, name, len)) {
-                               const char *r = header + len;   /* skip name */
-                               if (sip_cfg.pedanticsipchecking)
-                                       r = ast_skip_blanks(r);
-
-                               if (*r == ':') {
-                                       *start = x+1;
-                                       return ast_skip_blanks(r+1);
-                               }
+       const char *sname = find_alias(name, NULL);
+       int x, len = strlen(name), slen = (sname ? 1 : 0);
+       for (x = *start; x < req->headers; x++) {
+               const char *header = REQ_OFFSET_TO_STR(req, header[x]);
+               int smatch = 0, match = !strncasecmp(header, name, len);
+               if (slen) {
+                       smatch = !strncasecmp(header, sname, slen);
+               }
+               if (match || smatch) {
+                       /* skip name */
+                       const char *r = header + (match ? len : slen );
+                       if (sip_cfg.pedanticsipchecking) {
+                               r = ast_skip_blanks(r);
+                       }
+
+                       if (*r == ':') {
+                               *start = x+1;
+                               return ast_skip_blanks(r+1);
                        }
                }
-               if (pass == 0) /* Try aliases */
-                       name = find_alias(name, NULL);
        }
 
        /* Don't return NULL, so get_header is always a valid pointer */