filter: use size of fetched data in __load_pointer()
authorEric Dumazet <eric.dumazet@gmail.com>
Tue, 7 Dec 2010 22:26:15 +0000 (22:26 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 10 Dec 2010 04:47:04 +0000 (20:47 -0800)
__load_pointer() checks data we fetch from skb is included in head
portion, but assumes we fetch one byte, instead of up to four.

This wont crash because we have extra bytes (struct skb_shared_info)
after head, but this can read uninitialized bytes.

Fix this using size of the data (1, 2, 4 bytes) in the test.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/filter.c

index e193e29d4671811d8edc9677a68ad8e1683edf27..e8a6ac411ffb3a5e6ead2fb3e20daa21143af23a 100644 (file)
@@ -88,7 +88,7 @@ enum {
 };
 
 /* No hurry in this branch */
-static void *__load_pointer(const struct sk_buff *skb, int k)
+static void *__load_pointer(const struct sk_buff *skb, int k, unsigned int size)
 {
        u8 *ptr = NULL;
 
@@ -97,7 +97,7 @@ static void *__load_pointer(const struct sk_buff *skb, int k)
        else if (k >= SKF_LL_OFF)
                ptr = skb_mac_header(skb) + k - SKF_LL_OFF;
 
-       if (ptr >= skb->head && ptr < skb_tail_pointer(skb))
+       if (ptr >= skb->head && ptr + size <= skb_tail_pointer(skb))
                return ptr;
        return NULL;
 }
@@ -110,7 +110,7 @@ static inline void *load_pointer(const struct sk_buff *skb, int k,
        else {
                if (k >= SKF_AD_OFF)
                        return NULL;
-               return __load_pointer(skb, k);
+               return __load_pointer(skb, k, size);
        }
 }