|
@@ -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);
|
|
|
}
|