bpf: simplify __is_valid_access test on cb
authorDaniel Borkmann <daniel@iogearbox.net>
Tue, 24 Jan 2017 00:06:26 +0000 (01:06 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 24 Jan 2017 19:46:05 +0000 (14:46 -0500)
The __is_valid_access() test for cb[] from 62c7989b24db ("bpf: allow
b/h/w/dw access for bpf's cb in ctx") was done unnecessarily complex,
we can just simplify it the same way as recent fix from 2d071c643f1c
("bpf, trace: make ctx access checks more robust") did. Overflow can
never happen as size is 1/2/4/8 depending on access.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/filter.c

index 9038386..883975f 100644 (file)
@@ -2784,19 +2784,8 @@ static bool __is_valid_access(int off, int size)
        switch (off) {
        case offsetof(struct __sk_buff, cb[0]) ...
             offsetof(struct __sk_buff, cb[4]) + sizeof(__u32) - 1:
-               if (size == sizeof(__u16) &&
-                   off > offsetof(struct __sk_buff, cb[4]) + sizeof(__u16))
-                       return false;
-               if (size == sizeof(__u32) &&
-                   off > offsetof(struct __sk_buff, cb[4]))
-                       return false;
-               if (size == sizeof(__u64) &&
-                   off > offsetof(struct __sk_buff, cb[2]))
-                       return false;
-               if (size != sizeof(__u8)  &&
-                   size != sizeof(__u16) &&
-                   size != sizeof(__u32) &&
-                   size != sizeof(__u64))
+               if (off + size >
+                   offsetof(struct __sk_buff, cb[4]) + sizeof(__u32))
                        return false;
                break;
        default: