selftests/bpf: fix tests due to const spill/fill
authorAlexei Starovoitov <ast@kernel.org>
Sat, 15 Jun 2019 19:12:18 +0000 (12:12 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 19 Jun 2019 00:22:51 +0000 (02:22 +0200)
fix tests that incorrectly assumed that the verifier
cannot track constants through stack.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
tools/testing/selftests/bpf/verifier/direct_packet_access.c
tools/testing/selftests/bpf/verifier/helper_access_var_len.c

index d5c596fdc4b9a67127c36b56c3d24edd58348e2a..2c5fbe7bcd2730274b800544e91e05caaa16416f 100644 (file)
                    offsetof(struct __sk_buff, data)),
        BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
                    offsetof(struct __sk_buff, data_end)),
-       BPF_MOV64_IMM(BPF_REG_0, 0xffffffff),
+       BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
+                   offsetof(struct __sk_buff, mark)),
        BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
        BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
        BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff),
index 1f39d845c64f22bcfd1a2330d8e1b6a08253f472..67ab124100503b2d1fbd0f38187f8cb19862c5ee 100644 (file)
@@ -29,9 +29,9 @@
 {
        "helper access to variable memory: stack, bitwise AND, zero included",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-       BPF_MOV64_IMM(BPF_REG_2, 16),
        BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
        BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
@@ -46,9 +46,9 @@
 {
        "helper access to variable memory: stack, bitwise AND + JMP, wrong max",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-       BPF_MOV64_IMM(BPF_REG_2, 16),
        BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
        BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 65),
 {
        "helper access to variable memory: stack, JMP, bounds + offset",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-       BPF_MOV64_IMM(BPF_REG_2, 16),
        BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
        BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 5),
 {
        "helper access to variable memory: stack, JMP, wrong max",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-       BPF_MOV64_IMM(BPF_REG_2, 16),
        BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
        BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 65, 4),
 {
        "helper access to variable memory: stack, JMP, no max check",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-       BPF_MOV64_IMM(BPF_REG_2, 16),
        BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
        BPF_MOV64_IMM(BPF_REG_4, 0),
 {
        "helper access to variable memory: stack, JMP, no min check",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-       BPF_MOV64_IMM(BPF_REG_2, 16),
        BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
        BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 3),
 {
        "helper access to variable memory: stack, JMP (signed), no min check",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-       BPF_MOV64_IMM(BPF_REG_2, 16),
        BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
        BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 3),
 {
        "helper access to variable memory: map, JMP, wrong max",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
        BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
        BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
        BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
-       BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_6),
        BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
        BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, sizeof(struct test_val) + 1, 4),
        BPF_MOV64_IMM(BPF_REG_0, 0),
        BPF_EXIT_INSN(),
        },
-       .fixup_map_hash_48b = { 3 },
+       .fixup_map_hash_48b = { 4 },
        .errstr = "invalid access to map value, value_size=48 off=0 size=49",
        .result = REJECT,
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
 {
        "helper access to variable memory: map adjusted, JMP, wrong max",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
        BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
        BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20),
-       BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_6),
        BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
        BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, sizeof(struct test_val) - 19, 4),
        BPF_MOV64_IMM(BPF_REG_0, 0),
        BPF_EXIT_INSN(),
        },
-       .fixup_map_hash_48b = { 3 },
+       .fixup_map_hash_48b = { 4 },
        .errstr = "R1 min value is outside of the array range",
        .result = REJECT,
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
 {
        "helper access to variable memory: size > 0 not allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)",
        .insns = {
+       BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
        BPF_MOV64_IMM(BPF_REG_1, 0),
-       BPF_MOV64_IMM(BPF_REG_2, 1),
        BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
        BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
 {
        "helper access to variable memory: 8 bytes leak",
        .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
        BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
        BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
        BPF_MOV64_IMM(BPF_REG_0, 0),
        BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
        BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
        BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
-       BPF_MOV64_IMM(BPF_REG_2, 1),
        BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
        BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
        BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 63),