Error messages for some bad programs have changed, partly because we now
 check for loops / out-of-bounds jumps before checking subprogs.

Problematic selftests:
513 calls: wrong recursive calls
 This is now rejected with 'unreachable insn 1'.  I'm not entirely sure what
 it was meant to do/test, since all of the JMP|CALLs are also unreachable.
546 calls: ld_abs with changing ctx data in callee
 Rejected with R1 !read_ok.  It was testing for the "can't mix LD_ABS with
 function calls", which has now changed to "can't use LD_ABS in functions
 other than main()".  I'm still not 100% sure that's right though.

Signed-off-by: Edward Cree <ec...@solarflare.com>
---
 tools/testing/selftests/bpf/test_verifier.c | 46 ++++++++++++++++++-----------
 1 file changed, 29 insertions(+), 17 deletions(-)

diff --git a/tools/testing/selftests/bpf/test_verifier.c 
b/tools/testing/selftests/bpf/test_verifier.c
index 697bd83de295..9c7531887ee3 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -644,7 +644,7 @@ static struct bpf_test tests[] = {
                .insns = {
                        BPF_ALU64_REG(BPF_MOV, BPF_REG_0, BPF_REG_2),
                },
-               .errstr = "not an exit",
+               .errstr = "jump out of range",
                .result = REJECT,
        },
        {
@@ -9288,7 +9288,7 @@ static struct bpf_test tests[] = {
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "last insn is not an exit or jmp",
+               .errstr = "insn 1 was in subprog 1, now 0",
                .result = REJECT,
        },
        {
@@ -9354,7 +9354,7 @@ static struct bpf_test tests[] = {
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "jump out of range",
+               .errstr = "insn 5 was in subprog 1, now 0",
                .result = REJECT,
        },
        {
@@ -9633,7 +9633,7 @@ static struct bpf_test tests[] = {
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_SCHED_CLS,
-               .errstr = "jump out of range from insn 1 to 4",
+               .errstr = "insn 5 was in subprog 1, now 0",
                .result = REJECT,
        },
        {
@@ -9649,13 +9649,12 @@ static struct bpf_test tests[] = {
                        BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
                        BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
                        BPF_EXIT_INSN(),
-                       BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
-                                   offsetof(struct __sk_buff, len)),
+                       BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
                        BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3),
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "jump out of range from insn 11 to 9",
+               .errstr = "insn 9 was in subprog 1, now 2",
                .result = REJECT,
        },
        {
@@ -9707,7 +9706,7 @@ static struct bpf_test tests[] = {
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "invalid destination",
+               .errstr = "jump out of range from insn 2 to -1",
                .result = REJECT,
        },
        {
@@ -9719,7 +9718,7 @@ static struct bpf_test tests[] = {
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "invalid destination",
+               .errstr = "jump out of range from insn 2 to -2147483646",
                .result = REJECT,
        },
        {
@@ -9732,7 +9731,7 @@ static struct bpf_test tests[] = {
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "jump out of range",
+               .errstr = "insn 1 was in subprog 0, now 1",
                .result = REJECT,
        },
        {
@@ -9745,7 +9744,7 @@ static struct bpf_test tests[] = {
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "jump out of range",
+               .errstr = "insn 4 was in subprog 1, now 0",
                .result = REJECT,
        },
        {
@@ -9759,7 +9758,7 @@ static struct bpf_test tests[] = {
                        BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -2),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "not an exit",
+               .errstr = "jump out of range from insn 5 to 6",
                .result = REJECT,
        },
        {
@@ -9773,7 +9772,7 @@ static struct bpf_test tests[] = {
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "last insn",
+               .errstr = "insn_idx 5 is in subprog 1 but that starts at 4",
                .result = REJECT,
        },
        {
@@ -9788,7 +9787,7 @@ static struct bpf_test tests[] = {
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "last insn",
+               .errstr = "insn_idx 5 is in subprog 1 but that starts at 4",
                .result = REJECT,
        },
        {
@@ -9828,12 +9827,11 @@ static struct bpf_test tests[] = {
                        BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
                        BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
                        BPF_MOV64_REG(BPF_REG_0, BPF_REG_0),
-                       BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
-                                   offsetof(struct __sk_buff, len)),
+                       BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
                        BPF_EXIT_INSN(),
                },
                .prog_type = BPF_PROG_TYPE_TRACEPOINT,
-               .errstr = "not an exit",
+               .errstr = "insn 10 was in subprog 2, now 1",
                .result = REJECT,
        },
        {
@@ -11073,6 +11071,20 @@ static struct bpf_test tests[] = {
                .prog_type = BPF_PROG_TYPE_XDP,
        },
        {
+               "calls: interleaved functions",
+               .insns = {
+                       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
+                       BPF_MOV64_IMM(BPF_REG_0, 1),
+                       BPF_JMP_IMM(BPF_JA, 0, 0, 2),
+                       BPF_MOV64_IMM(BPF_REG_0, 2),
+                       BPF_JMP_IMM(BPF_JA, 0, 0, 1),
+                       BPF_EXIT_INSN(),
+                       BPF_EXIT_INSN(),
+               },
+               .prog_type = BPF_PROG_TYPE_TRACEPOINT,
+               .result = ACCEPT,
+       },
+       {
                "search pruning: all branches should be verified (nop 
operation)",
                .insns = {
                        BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),

Reply via email to