Skip to content

Commit

Permalink
nathelper: fix_nated_sdp added ignoring RFC3605-param if omitted
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
dwagin authored and linuxmaniac committed Nov 18, 2021
1 parent 1a68ddf commit fa60381
Showing 1 changed file with 18 additions and 19 deletions.
37 changes: 18 additions & 19 deletions src/modules/nathelper/nathelper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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;
}
Expand Down Expand Up @@ -1905,23 +1906,22 @@ 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;
}

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;
Expand Down Expand Up @@ -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 =
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit fa60381

Please sign in to comment.