netfilter: nf_ct_sip: handle non-linear skbs
authorPatrick McHardy <kaber@trash.net>
Fri, 14 May 2010 19:18:17 +0000 (21:18 +0200)
committerPatrick McHardy <kaber@trash.net>
Fri, 14 May 2010 19:18:17 +0000 (21:18 +0200)
Handle non-linear skbs by linearizing them instead of silently failing.
Long term the helper should be fixed to either work with non-linear skbs
directly by using the string search API or work on a copy of the data.

Based on patch by Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: Patrick McHardy <kaber@trash.net>
net/netfilter/nf_conntrack_sip.c

index b20f427..53d8922 100644 (file)
@@ -1393,10 +1393,8 @@ static int sip_help_tcp(struct sk_buff *skb, unsigned int protoff,
 
        nf_ct_refresh(ct, skb, sip_timeout * HZ);
 
-       if (skb_is_nonlinear(skb)) {
-               pr_debug("Copy of skbuff not supported yet.\n");
-               return NF_ACCEPT;
-       }
+       if (unlikely(skb_linearize(skb)))
+               return NF_DROP;
 
        dptr = skb->data + dataoff;
        datalen = skb->len - dataoff;
@@ -1455,10 +1453,8 @@ static int sip_help_udp(struct sk_buff *skb, unsigned int protoff,
 
        nf_ct_refresh(ct, skb, sip_timeout * HZ);
 
-       if (skb_is_nonlinear(skb)) {
-               pr_debug("Copy of skbuff not supported yet.\n");
-               return NF_ACCEPT;
-       }
+       if (unlikely(skb_linearize(skb)))
+               return NF_DROP;
 
        dptr = skb->data + dataoff;
        datalen = skb->len - dataoff;