dect
/
asterisk
Archived
13
0
Fork 0

Merged revisions 297607 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.8

................
  r297607 | jpeeler | 2010-12-06 16:06:37 -0600 (Mon, 06 Dec 2010) | 25 lines
  
  Merged revisions 297605 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.6.2
  
  ................
    r297605 | jpeeler | 2010-12-06 16:03:04 -0600 (Mon, 06 Dec 2010) | 18 lines
    
    Merged revisions 297603 via svnmerge from 
    https://origsvn.digium.com/svn/asterisk/branches/1.4
    
    ........
      r297603 | jpeeler | 2010-12-06 15:57:15 -0600 (Mon, 06 Dec 2010) | 12 lines
      
      Improve handling of REGISTER requests with multiple contact headers.
      
      The changes here attempt to more strictly follow RFC 3261 section 10.3.
      Basically the following will now cause a 400 Bad Response to be returned, if:
      - multiple Contact headers are present with one set to expire all bindings ("*")
      - wildcard parameter is specified for Contact without Expires header or Expires
        header is not set to zero.
      
      ABE-2442
      ABE-2443
    ........
  ................
................


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@297608 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
jpeeler 2010-12-06 22:10:41 +00:00
parent d99eeb9bb1
commit 55c65ef348
1 changed files with 30 additions and 6 deletions

View File

@ -13112,8 +13112,12 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
int transport_type;
const char *useragent;
struct ast_sockaddr oldsin, testsa;
char *firstcuri = NULL;
int start = 0;
int wildcard_found = 0;
int single_binding_found;
ast_copy_string(contact, get_header(req, "Contact"), sizeof(contact));
ast_copy_string(contact, __get_header(req, "Contact", &start), sizeof(contact));
if (ast_strlen_zero(expires)) { /* No expires header, try look in Contact: */
char *s = strcasestr(contact, ";expires=");
@ -13130,11 +13134,31 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
copy_socket_data(&pvt->socket, &req->socket);
/* Look for brackets */
curi = contact;
if (strchr(contact, '<') == NULL) /* No <, check for ; and strip it */
strsep(&curi, ";"); /* This is Header options, not URI options */
curi = get_in_brackets(contact);
do {
/* Look for brackets */
curi = contact;
if (strchr(contact, '<') == NULL) /* No <, check for ; and strip it */
strsep(&curi, ";"); /* This is Header options, not URI options */
curi = get_in_brackets(contact);
if (!firstcuri) {
firstcuri = ast_strdupa(curi);
}
if (!strcasecmp(curi, "*")) {
wildcard_found = 1;
} else {
single_binding_found = 1;
}
if (wildcard_found && (ast_strlen_zero(expires) || expire != 0 || single_binding_found)) {
/* Contact header parameter "*" detected, so punt if: Expires header is missing,
* Expires value is not zero, or another Contact header is present. */
return PARSE_REGISTER_FAILED;
}
ast_copy_string(contact, __get_header(req, "Contact", &start), sizeof(contact));
} while (!ast_strlen_zero(contact));
curi = firstcuri;
/* if they did not specify Contact: or Expires:, they are querying
what we currently have stored as their contact address, so return