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