diff options
author | Kinsey Moore <kmoore@digium.com> | 2012-02-09 20:52:13 +0000 |
---|---|---|
committer | Kinsey Moore <kmoore@digium.com> | 2012-02-09 20:52:13 +0000 |
commit | 6225c6cadc33840603f0790ec335c8b053ff079d (patch) | |
tree | bd3e8056d4973a80179f5d5d994cf7efede2d804 /channels | |
parent | 25e344168e9764cbba1af7b58d529cbe0f9ae01c (diff) |
Fix parsing of SIP headers where compact and non-compact headers are mixed
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/
........
Merged revisions 354702 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 354703 from http://svn.asterisk.org/svn/asterisk/branches/10
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@354704 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index f138bd474..8d6703fa1 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -7459,8 +7459,6 @@ static const char *find_full_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 @@ -7470,25 +7468,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); - } + 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 (*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 sip_get_header is always a valid pointer */ |