diff options
| -rw-r--r-- | net/ipv4/netfilter/nf_nat_sip.c | 38 | 
1 files changed, 25 insertions, 13 deletions
| diff --git a/net/ipv4/netfilter/nf_nat_sip.c b/net/ipv4/netfilter/nf_nat_sip.c index 4334d5cabc5b..14544320c545 100644 --- a/net/ipv4/netfilter/nf_nat_sip.c +++ b/net/ipv4/netfilter/nf_nat_sip.c @@ -318,11 +318,11 @@ static int mangle_content_len(struct sk_buff *skb,  			     buffer, buflen);  } -static unsigned mangle_sdp_packet(struct sk_buff *skb, const char **dptr, -				  unsigned int dataoff, unsigned int *datalen, -				  enum sdp_header_types type, -				  enum sdp_header_types term, -				  char *buffer, int buflen) +static int mangle_sdp_packet(struct sk_buff *skb, const char **dptr, +			     unsigned int dataoff, unsigned int *datalen, +			     enum sdp_header_types type, +			     enum sdp_header_types term, +			     char *buffer, int buflen)  {  	enum ip_conntrack_info ctinfo;  	struct nf_conn *ct = nf_ct_get(skb, &ctinfo); @@ -330,9 +330,9 @@ static unsigned mangle_sdp_packet(struct sk_buff *skb, const char **dptr,  	if (ct_sip_get_sdp_header(ct, *dptr, dataoff, *datalen, type, term,  				  &matchoff, &matchlen) <= 0) -		return 0; +		return -ENOENT;  	return mangle_packet(skb, dptr, datalen, matchoff, matchlen, -			     buffer, buflen); +			     buffer, buflen) ? 0 : -EINVAL;  }  static unsigned int ip_nat_sdp_addr(struct sk_buff *skb, const char **dptr, @@ -346,8 +346,8 @@ static unsigned int ip_nat_sdp_addr(struct sk_buff *skb, const char **dptr,  	unsigned int buflen;  	buflen = sprintf(buffer, NIPQUAD_FMT, NIPQUAD(addr->ip)); -	if (!mangle_sdp_packet(skb, dptr, dataoff, datalen, type, term, -			       buffer, buflen)) +	if (mangle_sdp_packet(skb, dptr, dataoff, datalen, type, term, +			      buffer, buflen))  		return 0;  	return mangle_content_len(skb, dptr, datalen); @@ -381,15 +381,27 @@ static unsigned int ip_nat_sdp_session(struct sk_buff *skb, const char **dptr,  	/* Mangle session description owner and contact addresses */  	buflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(addr->ip)); -	if (!mangle_sdp_packet(skb, dptr, dataoff, datalen, +	if (mangle_sdp_packet(skb, dptr, dataoff, datalen,  			       SDP_HDR_OWNER_IP4, SDP_HDR_MEDIA,  			       buffer, buflen))  		return 0; -	if (!mangle_sdp_packet(skb, dptr, dataoff, datalen, -			       SDP_HDR_CONNECTION_IP4, SDP_HDR_MEDIA, -			       buffer, buflen)) +	switch (mangle_sdp_packet(skb, dptr, dataoff, datalen, +				  SDP_HDR_CONNECTION_IP4, SDP_HDR_MEDIA, +				  buffer, buflen)) { +	case 0: +	/* +	 * RFC 2327: +	 * +	 * Session description +	 * +	 * c=* (connection information - not required if included in all media) +	 */ +	case -ENOENT: +		break; +	default:  		return 0; +	}  	return mangle_content_len(skb, dptr, datalen);  } | 
