]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[SNAP]: Check packet length before reading
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 2 Nov 2007 21:53:44 +0000 (22:53 +0100)
committerAdrian Bunk <bunk@kernel.org>
Fri, 2 Nov 2007 21:53:44 +0000 (22:53 +0100)
The snap_rcv code reads 5 bytes so we should make sure that
we have 5 bytes in the head before proceeding.

Based on diagnosis and fix by Evgeniy Polyakov, reported by
Alan J. Wylie.

Patch also kills the skb->sk assignment before kfree_skb
since it's redundant.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Adrian Bunk <bunk@kernel.org>
net/802/psnap.c

index 34e42968b477d9291a1671dfa32a43af77b7a74c..b920aa206666bfd4251177fbadad6613f8974744 100644 (file)
@@ -55,6 +55,9 @@ static int snap_rcv(struct sk_buff *skb, struct net_device *dev,
                .type = __constant_htons(ETH_P_SNAP),
        };
 
+       if (unlikely(!pskb_may_pull(skb, 5)))
+               goto drop;
+
        rcu_read_lock();
        proto = find_snap_client(skb->h.raw);
        if (proto) {
@@ -64,14 +67,18 @@ static int snap_rcv(struct sk_buff *skb, struct net_device *dev,
                skb_pull(skb, 5);
                skb_postpull_rcsum(skb, hdr, 5);
                rc = proto->rcvfunc(skb, dev, &snap_packet_type, orig_dev);
-       } else {
-               skb->sk = NULL;
-               kfree_skb(skb);
-               rc = 1;
        }
-
        rcu_read_unlock();
+
+       if (unlikely(!proto))
+               goto drop;
+
+out:
        return rc;
+
+drop:
+       kfree_skb(skb);
+       goto out;
 }
 
 /*