net: filter: add test case for jump with holes and ret x variants
authorDaniel Borkmann <dborkman@redhat.com>
Fri, 23 May 2014 16:44:01 +0000 (18:44 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 May 2014 20:48:06 +0000 (16:48 -0400)
This patch adds three more test cases:

 1) long jumps with holes of unreachable code
 2) ret x
 3) ldx + ret x

All three tests are for classical BPF and to make sure that
any changes will not break some exotic behaviour that exists
probably since decades. The last two tests are expected to
fail by the BPF checker already, as in classic BPF only K
or A are allowed to be returned. Thus, there are now 52 test
cases for BPF.

Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Acked-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
lib/test_bpf.c

index da34e337f45bdd51d07569c0bdb31a7ac789ebb8..af677cb718f52b091a1f74f9afac34b740b97b84 100644 (file)
@@ -1391,6 +1391,100 @@ static struct bpf_test tests[] = {
                { },
                { }
        },
+       {
+               "JUMPS + HOLES",
+               .u.insns = {
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
+                       BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
+                       BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
+                       BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
+                       BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
+                       BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
+                       BPF_STMT(BPF_RET | BPF_A, 0),
+                       BPF_STMT(BPF_RET | BPF_A, 0),
+               },
+               CLASSIC,
+               { 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8, 0x90, 0xe2,
+                 0xba, 0x0a, 0x56, 0xb4, 0x08, 0x00, 0x45, 0x00,
+                 0x00, 0x28, 0x00, 0x00, 0x20, 0x00, 0x40, 0x11,
+                 0x00, 0x00, 0xc0, 0xa8, 0x33, 0x01, 0xc0, 0xa8,
+                 0x33, 0x02, 0xbb, 0xb6, 0xa9, 0xfa, 0x00, 0x14,
+                 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
+                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
+                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
+                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
+                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
+                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc },
+               { { 88, 0x001b } }
+       },
+       {
+               "check: RET X",
+               .u.insns = {
+                       BPF_STMT(BPF_RET | BPF_X, 0),
+               },
+               CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
+               { },
+               { },
+       },
+       {
+               "check: LDX + RET X",
+               .u.insns = {
+                       BPF_STMT(BPF_LDX | BPF_IMM, 42),
+                       BPF_STMT(BPF_RET | BPF_X, 0),
+               },
+               CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
+               { },
+               { },
+       },
 };
 
 static struct net_device dev;