mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-17 15:29:05 +00:00
Merge "PJSIP: Remove PJSIP parsing functions from uri length validation."
This commit is contained in:
@@ -412,38 +412,64 @@ static int permanent_uri_sort_fn(const void *obj_left, const void *obj_right, in
|
|||||||
|
|
||||||
int ast_sip_validate_uri_length(const char *contact_uri)
|
int ast_sip_validate_uri_length(const char *contact_uri)
|
||||||
{
|
{
|
||||||
pjsip_uri *uri;
|
|
||||||
pjsip_sip_uri *sip_uri;
|
|
||||||
pj_pool_t *pool;
|
|
||||||
int max_length = pj_max_hostname - 1;
|
int max_length = pj_max_hostname - 1;
|
||||||
|
char *contact = ast_strdupa(contact_uri);
|
||||||
|
char *host;
|
||||||
|
char *at;
|
||||||
|
int theres_a_port = 0;
|
||||||
|
|
||||||
if (strlen(contact_uri) > pjsip_max_url_size - 1) {
|
if (strlen(contact_uri) > pjsip_max_url_size - 1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(pool = pjsip_endpt_create_pool(ast_sip_get_pjsip_endpoint(), "uri validation", 512, 512))) {
|
contact = ast_strip_quoted(contact, "<", ">");
|
||||||
ast_log(LOG_ERROR, "Unable to allocate pool for uri validation\n");
|
|
||||||
|
if (!strncasecmp(contact, "sip:", 4)) {
|
||||||
|
host = contact + 4;
|
||||||
|
} else if (!strncasecmp(contact, "sips:", 5)) {
|
||||||
|
host = contact + 5;
|
||||||
|
} else {
|
||||||
|
/* Not a SIP URI */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(uri = pjsip_parse_uri(pool, (char *)contact_uri, strlen(contact_uri), 0)) ||
|
at = strchr(contact, '@');
|
||||||
(!PJSIP_URI_SCHEME_IS_SIP(uri) && !PJSIP_URI_SCHEME_IS_SIPS(uri))) {
|
if (at) {
|
||||||
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
|
/* sip[s]:user@host */
|
||||||
return -1;
|
host = at + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sip_uri = pjsip_uri_get_uri(uri);
|
if (host[0] == '[') {
|
||||||
if (sip_uri->port == 0) {
|
/* Host is an IPv6 address. Just get up to the matching bracket */
|
||||||
|
char *close_bracket;
|
||||||
|
|
||||||
|
close_bracket = strchr(host, ']');
|
||||||
|
if (!close_bracket) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
close_bracket++;
|
||||||
|
if (*close_bracket == ':') {
|
||||||
|
theres_a_port = 1;
|
||||||
|
}
|
||||||
|
*close_bracket = '\0';
|
||||||
|
} else {
|
||||||
|
/* uri parameters could contain ';' so trim them off first */
|
||||||
|
host = strsep(&host, ";?");
|
||||||
|
/* Host is FQDN or IPv4 address. Need to find closing delimiter */
|
||||||
|
if (strchr(host, ':')) {
|
||||||
|
theres_a_port = 1;
|
||||||
|
host = strsep(&host, ":");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!theres_a_port) {
|
||||||
max_length -= strlen("_sips.tcp.");
|
max_length -= strlen("_sips.tcp.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sip_uri->host.slen > max_length) {
|
if (strlen(host) > max_length) {
|
||||||
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user