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:
parent
d99eeb9bb1
commit
55c65ef348
|
@ -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
|
||||
|
|
Reference in New Issue