tree fbf89b8f1365c18c5c2ee0fad15f61f6f3127af8
parent 17af691cd19765b782d891fc50c1568d0f1276b3
author Patrick McHardy <[EMAIL PROTECTED]> Wed, 06 Jul 2005 04:08:10 -0700
committer David S. Miller <[EMAIL PROTECTED]> Wed, 06 Jul 2005 04:08:10 -0700

[NET]: Fix signedness issues in net/core/filter.c

This is the code to load packet data into a register:

                        k = fentry->k;
                        if (k < 0) {
..
                        } else {
                                u32 _tmp, *p;
                                p = skb_header_pointer(skb, k, 4, &_tmp);
                                if (p != NULL) {
                                        A = ntohl(*p);
                                        continue;
                                }
                        }

skb_header_pointer checks if the requested data is within the
linear area:

        int hlen = skb_headlen(skb);

        if (offset + len <= hlen)
                return skb->data + offset;

When offset is within [INT_MAX-len+1..INT_MAX] the addition will
result in a negative number which is <= hlen.

I couldn't trigger a crash on my AMD64 with 2GB of memory, but a
coworker tried on his x86 machine and it crashed immediately.

This patch fixes the check in skb_header_pointer to handle large
positive offsets similar to skb_copy_bits. Invalid data can still
be accessed using negative offsets (also similar to skb_copy_bits),
anyone using negative offsets needs to verify them himself.

Thanks to Thomas V�gtle <[EMAIL PROTECTED]> for verifying the
problem by crashing his machine and providing me with an Oops.

Signed-off-by: Patrick McHardy <[EMAIL PROTECTED]>
Acked-by: Herbert Xu <[EMAIL PROTECTED]>
Signed-off-by: David S. Miller <[EMAIL PROTECTED]>

 include/linux/skbuff.h |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1211,7 +1211,7 @@ static inline void *skb_header_pointer(c
 {
        int hlen = skb_headlen(skb);
 
-       if (offset + len <= hlen)
+       if (hlen - offset >= len)
                return skb->data + offset;
 
        if (skb_copy_bits(skb, offset, buffer, len) < 0)
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to