From: Bogdan-Andrei Iancu Date: Fri, 5 Feb 2016 13:31:40 +0200 Subject: [PATCH] Fix IPv6 insertion in fix_nated_contact() Add the [ ] around IPv6 in the newly built contact URI. Reported by Jonathan Hunter on the mailing list (cherry picked from commit ce89e291e0616d80d555f1e386edde5bbd3922e9) diff --git a/modules/nathelper/nathelper.c b/modules/nathelper/nathelper.c index d72abc2..67296c0 100644 --- a/modules/nathelper/nathelper.c +++ b/modules/nathelper/nathelper.c @@ -601,6 +601,7 @@ fix_nated_contact_f(struct sip_msg* msg, char* str1, char* str2) cp = ip_addr2a(&msg->rcv.src_ip); len = (hostport.s-c->uri.s) + strlen(cp) + 6 /* :port */ + + 2 /* just in case if IPv6 */ + (params?params->len+(is_enclosed?0:2):0) + 1 + left.len + left2.len; buf = pkg_malloc(len); @@ -610,15 +611,28 @@ fix_nated_contact_f(struct sip_msg* msg, char* str1, char* str2) } temp = hostport.s[0]; hostport.s[0] = '\0'; if (params==NULL) { - len1 = snprintf(buf, len, "%s%s:%d%.*s%.*s", c->uri.s, cp, - msg->rcv.src_port,left.len,left.s,left2.len,left2.s); + if (msg->rcv.src_ip.af==AF_INET6) + len1 = snprintf(buf, len, "%s[%s]:%d%.*s%.*s", c->uri.s, cp, + msg->rcv.src_port,left.len,left.s,left2.len,left2.s); + else + len1 = snprintf(buf, len, "%s%s:%d%.*s%.*s", c->uri.s, cp, + msg->rcv.src_port,left.len,left.s,left2.len,left2.s); } else if (!is_enclosed) { - len1 = snprintf(buf, len, "<%s%s:%d%.*s>", c->uri.s, cp, - msg->rcv.src_port,params->len,params->s); + if (msg->rcv.src_ip.af==AF_INET6) + len1 = snprintf(buf, len, "<%s[%s]:%d%.*s>", c->uri.s, cp, + msg->rcv.src_port,params->len,params->s); + else + len1 = snprintf(buf, len, "<%s%s:%d%.*s>", c->uri.s, cp, + msg->rcv.src_port,params->len,params->s); } else { - len1 = snprintf(buf, len, "%s%s:%d%.*s%.*s%.*s", c->uri.s, cp, - msg->rcv.src_port,params->len,params->s, - left.len,left.s,left2.len,left2.s); + if (msg->rcv.src_ip.af==AF_INET6) + len1 = snprintf(buf, len, "%s[%s]:%d%.*s%.*s%.*s", c->uri.s, cp, + msg->rcv.src_port,params->len,params->s, + left.len,left.s,left2.len,left2.s); + else + len1 = snprintf(buf, len, "%s%s:%d%.*s%.*s%.*s", c->uri.s, cp, + msg->rcv.src_port,params->len,params->s, + left.len,left.s,left2.len,left2.s); } if (len1 < len) len = len1;