[sr-dev] git:master:d62fd3e4: presence: build proper ipv6 contact when server address is not set

Daniel-Constantin Mierla miconda at gmail.com
Fri Jan 20 17:16:29 CET 2017


Module: kamailio
Branch: master
Commit: d62fd3e4976633aa6b827d527f4e15de0b08068b
URL: https://github.com/kamailio/kamailio/commit/d62fd3e4976633aa6b827d527f4e15de0b08068b

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2017-01-20T17:15:10+01:00

presence: build proper ipv6 contact when server address is not set

- reported by GH #943

---

Modified: src/modules/presence/utils_func.h

---

Diff:  https://github.com/kamailio/kamailio/commit/d62fd3e4976633aa6b827d527f4e15de0b08068b.diff
Patch: https://github.com/kamailio/kamailio/commit/d62fd3e4976633aa6b827d527f4e15de0b08068b.patch

---

diff --git a/src/modules/presence/utils_func.h b/src/modules/presence/utils_func.h
index ed48372..b68890f 100644
--- a/src/modules/presence/utils_func.h
+++ b/src/modules/presence/utils_func.h
@@ -77,7 +77,7 @@ static inline int uandd_to_uri(str user,  str domain, str *out)
 	memcpy(out->s + out->len, domain.s, domain.len);
 	out->len += domain.len;
 	out->s[out->len] = '\0';
-	
+
 	return 0;
 }
 
@@ -88,6 +88,7 @@ static inline int ps_fill_local_contact(struct sip_msg* msg, str *contact)
 	int port;
 	int len;
 	int plen;
+	char *p;
 
 	contact->s= (char*)pkg_malloc(LCONTACT_BUF_SIZE);
 	if(contact->s== NULL)
@@ -98,22 +99,22 @@ static inline int ps_fill_local_contact(struct sip_msg* msg, str *contact)
 
 	memset(contact->s, 0, LCONTACT_BUF_SIZE);
 	contact->len= 0;
-	
+
 	plen = 3;
 	if(msg->rcv.proto== PROTO_NONE || msg->rcv.proto==PROTO_UDP)
 		proto= "udp";
 	else
 	if(msg->rcv.proto== PROTO_TLS )
 			proto= "tls";
-	else	
+	else
 	if(msg->rcv.proto== PROTO_TCP)
 		proto= "tcp";
-	else	
+	else
 	if(msg->rcv.proto== PROTO_SCTP) {
 		proto= "sctp";
 		plen = 4;
 	}
-	else	
+	else
 	if(msg->rcv.proto== PROTO_WS || msg->rcv.proto== PROTO_WSS) {
 		proto= "ws";
 		plen = 2;
@@ -122,8 +123,8 @@ static inline int ps_fill_local_contact(struct sip_msg* msg, str *contact)
 	{
 		LM_ERR("unsupported proto\n");
 		goto error;
-	}	
-	
+	}
+
 	if(msg->rcv.bind_address->useinfo.name.len>0) {
 		ip = msg->rcv.bind_address->useinfo.name;
 	} else {
@@ -135,30 +136,41 @@ static inline int ps_fill_local_contact(struct sip_msg* msg, str *contact)
 	} else {
 		port = msg->rcv.bind_address->port_no;
 	}
-	
-	if(strncmp(ip.s, "sip:", 4)!=0)
-	{
-		strncpy(contact->s, "sip:", 4);
-		contact->len+= 4;
-	}	
-	strncpy(contact->s+contact->len, ip.s, ip.len);
+
+	p = contact->s;
+	if(strncmp(ip.s, "sip:", 4)!=0) {
+		strncpy(p, "sip:", 4);
+		contact->len += 4;
+		p += 4;
+	}
+	if(msg->rcv.bind_address->address.af==AF_INET6) {
+		*p = '[';
+		contact->len += 1;
+		p += 1;
+	}
+	strncpy(p, ip.s, ip.len);
 	contact->len += ip.len;
-	if(contact->len> LCONTACT_BUF_SIZE - 21)
-	{
+	p += ip.len;
+	if(msg->rcv.bind_address->address.af==AF_INET6) {
+		*p = ']';
+		contact->len += 1;
+		p += 1;
+	}
+	if(contact->len > LCONTACT_BUF_SIZE - 21) {
 		LM_ERR("buffer overflow\n");
 		goto error;
 
-	}	
-	len= sprintf(contact->s+contact->len, ":%d;transport=" , port);
-	if(len< 0)
-	{
+	}
+	len= sprintf(p, ":%d;transport=" , port);
+	if(len< 0) {
 		LM_ERR("unsuccessful sprintf\n");
 		goto error;
-	}	
-	contact->len+= len;
-	strncpy(contact->s+ contact->len, proto, plen);
+	}
+	contact->len += len;
+	p += len;
+	strncpy(p, proto, plen);
 	contact->len += plen;
-	
+
 	return 0;
 error:
 	if(contact->s!=NULL)




More information about the sr-dev mailing list