aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsimon.perreault <simon.perreault@f38db490-d61c-443f-a65b-d21fe96a405b>2010-08-03 19:54:03 +0000
committersimon.perreault <simon.perreault@f38db490-d61c-443f-a65b-d21fe96a405b>2010-08-03 19:54:03 +0000
commitc941d63d0d794acbddff5666b5eda7ae309fd260 (patch)
tree9a227ecefdcfa184ca63875114c59a88689786b5
parentc2c8c8b318bf482873570a7222159a9845f36047 (diff)
Fixed IPv6-related SIP parsing bugs.
(closes issue #17663) Reported by: oej Patches: diff uploaded by sperreault (license 252) diff2 uploaded by sperreault (license 252) get_domain.diff uploaded by sperreault (license 252) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.8@280778 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_sip.c46
1 files changed, 34 insertions, 12 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 375c7ba53..47dc2610d 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -9872,12 +9872,22 @@ static int get_domain(const char *str, char *domain, int len)
from = NULL;
if (from) {
+ int bracket = 0;
+
/* Strip any params or options from user */
if ((a = strchr(from, ';')))
*a = '\0';
/* Strip port from domain if present */
- if ((a = strchr(from, ':')))
- *a = '\0';
+ for (a = from; *a != '\0'; ++a) {
+ if (*a == ':' && bracket == 0) {
+ *a = '\0';
+ break;
+ } else if (*a == '[') {
+ ++bracket;
+ } else if (*a == ']') {
+ --bracket;
+ }
+ }
if ((a = strchr(from, '@'))) {
*a = '\0';
ast_copy_string(domain, a + 1, len);
@@ -14473,17 +14483,27 @@ static int get_refer_info(struct sip_pvt *transferer, struct sip_request *outgoi
if ((ptr = strchr(refer_to, '@'))) { /* Separate domain */
char *urioption = NULL, *domain;
+ int bracket = 0;
*ptr++ = '\0';
if ((urioption = strchr(ptr, ';'))) { /* Separate urioptions */
*urioption++ = '\0';
}
-
+
domain = ptr;
- if ((ptr = strchr(domain, ':'))) { /* Remove :port */
- *ptr = '\0';
+
+ /* Remove :port */
+ for (; *ptr != '\0'; ++ptr) {
+ if (*ptr == ':' && bracket == 0) {
+ *ptr = '\0';
+ break;
+ } else if (*ptr == '[') {
+ ++bracket;
+ } else if (*ptr == ']') {
+ --bracket;
+ }
}
-
+
SIP_PEDANTIC_DECODE(domain);
SIP_PEDANTIC_DECODE(urioption);
@@ -27041,10 +27061,12 @@ static int reload_config(enum channelreloadreason reason)
/* First our default IP address */
if (!ast_sockaddr_isnull(&bindaddr)) {
- add_sip_domain(ast_sockaddr_stringify(&bindaddr), SIP_DOMAIN_AUTO, NULL);
+ add_sip_domain(ast_sockaddr_stringify_addr(&bindaddr),
+ SIP_DOMAIN_AUTO, NULL);
} else if (!ast_sockaddr_isnull(&internip)) {
/* Our internal IP address, if configured */
- add_sip_domain(ast_sockaddr_stringify(&internip), SIP_DOMAIN_AUTO, NULL);
+ add_sip_domain(ast_sockaddr_stringify_addr(&internip),
+ SIP_DOMAIN_AUTO, NULL);
} else {
ast_log(LOG_NOTICE, "Can't add wildcard IP address to domain list, please add IP address to domain manually.\n");
}
@@ -27052,7 +27074,7 @@ static int reload_config(enum channelreloadreason reason)
/* If TCP is running on a different IP than UDP, then add it too */
if (!ast_sockaddr_isnull(&sip_tcp_desc.local_address) &&
!ast_sockaddr_cmp(&bindaddr, &sip_tcp_desc.local_address)) {
- add_sip_domain(ast_sockaddr_stringify(&sip_tcp_desc.local_address),
+ add_sip_domain(ast_sockaddr_stringify_addr(&sip_tcp_desc.local_address),
SIP_DOMAIN_AUTO, NULL);
}
@@ -27061,14 +27083,14 @@ static int reload_config(enum channelreloadreason reason)
!ast_sockaddr_cmp(&bindaddr, &sip_tls_desc.local_address) &&
!ast_sockaddr_cmp(&sip_tcp_desc.local_address,
&sip_tls_desc.local_address)) {
- add_sip_domain(ast_sockaddr_stringify(&sip_tcp_desc.local_address),
+ add_sip_domain(ast_sockaddr_stringify_addr(&sip_tcp_desc.local_address),
SIP_DOMAIN_AUTO, NULL);
}
/* Our extern IP address, if configured */
if (!ast_sockaddr_isnull(&externaddr)) {
- add_sip_domain(ast_sockaddr_stringify(&externaddr), SIP_DOMAIN_AUTO,
- NULL);
+ add_sip_domain(ast_sockaddr_stringify_addr(&externaddr),
+ SIP_DOMAIN_AUTO, NULL);
}
/* Extern host name (NAT traversal support) */