summaryrefslogtreecommitdiff
path: root/channels/chan_sip.c
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2012-02-09 20:52:13 +0000
committerKinsey Moore <kmoore@digium.com>2012-02-09 20:52:13 +0000
commit6225c6cadc33840603f0790ec335c8b053ff079d (patch)
treebd3e8056d4973a80179f5d5d994cf7efede2d804 /channels/chan_sip.c
parent25e344168e9764cbba1af7b58d529cbe0f9ae01c (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/chan_sip.c')
-rw-r--r--channels/chan_sip.c35
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 */