From: Bogdan-Andrei Iancu <bogdan@opensips.org>
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;