[sr-dev] git:master:fa603817: nathelper: fix_nated_sdp added ignoring RFC3605-param if omitted

Victor Seva linuxmaniac at torreviejawireless.org
Thu Nov 18 11:39:06 CET 2021


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

Author: Dmitry Wagin <dmitry.wagin at ya.ru>
Committer: Victor Seva <linuxmaniac at torreviejawireless.org>
Date: 2021-11-18T11:16:31+01:00

nathelper: fix_nated_sdp added ignoring RFC3605-param if omitted

- doesn't throw an error while "a=rtcp" param is omitted (RFC1889 behavior) or address is omitted
- replace_sdp_ip() returns 0 on omitted IP-address
- added param can_omit to replace_sdp_ip()

fixes #2784 regression introduced by #2497

---

Modified: src/modules/nathelper/nathelper.c

---

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

---

diff --git a/src/modules/nathelper/nathelper.c b/src/modules/nathelper/nathelper.c
index bd71eaafc4..ed81edf691 100644
--- a/src/modules/nathelper/nathelper.c
+++ b/src/modules/nathelper/nathelper.c
@@ -1777,13 +1777,12 @@ static int is_rfc1918_f(struct sip_msg *msg, char *str1, char *str2)
 #define AOLDMEDPRT_LEN (sizeof(AOLDMEDPRT) - 1)
 
 
-/* replace ip addresses in SDP and return umber of replacements */
+/* replace ip addresses in SDP and return number of replacements */
 static inline int replace_sdp_ip(
-		struct sip_msg *msg, str *org_body, char *line, str *ip, int linelen)
+		struct sip_msg *msg, str *org_body, char *line, str *ip, int linelen, int can_omit)
 {
 	str body1, oldip, newip;
 	str body = *org_body;
-	unsigned hasreplaced = 0;
 	int pf, pf1 = 0;
 	str body2;
 	char *bodylimit = body.s + body.len;
@@ -1799,10 +1798,17 @@ static inline int replace_sdp_ip(
 	}
 	body1 = body;
 	for(;;) {
-		if(nh_extract_mediaip(&body1, &oldip, &pf, line, linelen) == -1)
+		ret = nh_extract_mediaip(&body1, &oldip, &pf, line, linelen);
+		if(ret == 0)
 			break;
-		if(pf != AF_INET) {
-			LM_ERR("not an IPv4 address in '%s' SDP\n", line);
+		if(ret == -1) {
+			if(can_omit) {
+				body2.s = body1.s + linelen;
+				body2.len = bodylimit - body2.s;
+				body1 = body2;
+				continue;
+			}
+			LM_ERR("no `IP[4|6]' in `%s' field\n", line);
 			return -1;
 		}
 		if(!pf1)
@@ -1820,13 +1826,8 @@ static inline int replace_sdp_ip(
 			return -1;
 		}
 		count += ret;
-		hasreplaced = 1;
 		body1 = body2;
 	}
-	if(!hasreplaced && linelen>=6 && memcmp("a=rtcp", line, 6)!=0) {
-		LM_ERR("can't extract '%s' IP from the SDP\n", line);
-		return -1;
-	}
 
 	return count;
 }
@@ -1905,15 +1906,14 @@ static int ki_fix_nated_sdp_ip(sip_msg_t *msg, int level, str *ip)
 	if(level & (FIX_MEDIP | FIX_ORGIP)) {
 
 		/* Iterate all a=rtcp and replace ips in them. rfc3605 */
-		ret = replace_sdp_ip(msg, &body, "a=rtcp", (ip && ip->len>0) ? ip : 0, 6);
+		ret = replace_sdp_ip(msg, &body, "a=rtcp", (ip && ip->len>0) ? ip : 0, 6, 1);
 		if(ret == -1)
-			LM_DBG("a=rtcp parameter does not exist. nothing to do.\n");
-		else 
-			count += ret;
+			return -1;
+		count += ret;
 
 		if(level & FIX_MEDIP) {
 			/* Iterate all c= and replace ips in them. */
-			ret = replace_sdp_ip(msg, &body, "c=", (ip && ip->len>0) ? ip : 0, 2);
+			ret = replace_sdp_ip(msg, &body, "c=", (ip && ip->len>0) ? ip : 0, 2, 0);
 			if(ret == -1)
 				return -1;
 			count += ret;
@@ -1921,7 +1921,7 @@ static int ki_fix_nated_sdp_ip(sip_msg_t *msg, int level, str *ip)
 
 		if(level & FIX_ORGIP) {
 			/* Iterate all o= and replace ips in them. */
-			ret = replace_sdp_ip(msg, &body, "o=",  (ip && ip->len>0) ? ip : 0, 2);
+			ret = replace_sdp_ip(msg, &body, "o=",  (ip && ip->len>0) ? ip : 0, 2, 0);
 			if(ret == -1)
 				return -1;
 			count += ret;
@@ -1968,7 +1968,7 @@ static int nh_extract_mediaip(str *body, str *mediaip, int *pf, char *line,
 		cp = cp1 + linelen;
 	}
 	if(cp1 == NULL)
-		return -1;
+		return 0;
 
 	mediaip->s = cp1 + linelen;
 	mediaip->len =
@@ -2003,7 +2003,6 @@ static int nh_extract_mediaip(str *body, str *mediaip, int *pf, char *line,
 		cp = eat_space_end(cp + len, mediaip->s + mediaip->len);
 	}
 	if(nextisip != 2 || mediaip->len == 0) {
-		LM_ERR("no `IP[4|6]' in `%s' field\n", line);
 		return -1;
 	}
 	return 1;




More information about the sr-dev mailing list