OSDN Git Service

bpf: Test_verifier, #65 error message updates for trunc of boundary-cross
authorJohn Fastabend <john.fastabend@gmail.com>
Mon, 30 Mar 2020 21:38:01 +0000 (14:38 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 30 Mar 2020 22:00:30 +0000 (15:00 -0700)
After changes to add update_reg_bounds after ALU ops and 32-bit bounds
tracking truncation of boundary crossing range will fail earlier and with
a different error message. Now the test error trace is the following

11: (17) r1 -= 2147483584
12: R0_w=map_value(id=0,off=0,ks=8,vs=8,imm=0)
    R1_w=invP(id=0,smin_value=-2147483584,smax_value=63)
    R10=fp0 fp-8_w=mmmmmmmm
12: (17) r1 -= 2147483584
13: R0_w=map_value(id=0,off=0,ks=8,vs=8,imm=0)
    R1_w=invP(id=0,
              umin_value=18446744069414584448,umax_value=18446744071562068095,
              var_off=(0xffffffff00000000; 0xffffffff))
    R10=fp0 fp-8_w=mmmmmmmm
13: (77) r1 >>= 8
14: R0_w=map_value(id=0,off=0,ks=8,vs=8,imm=0)
    R1_w=invP(id=0,
              umin_value=72057594021150720,umax_value=72057594029539328,
              var_off=(0xffffffff000000; 0xffffff),
              s32_min_value=-16777216,s32_max_value=-1,
              u32_min_value=-16777216)
    R10=fp0 fp-8_w=mmmmmmmm
14: (0f) r0 += r1
value 72057594021150720 makes map_value pointer be out of bounds

Because we have 'umin_value == umax_value' instead of previously
where 'umin_value != umax_value' we can now fail earlier noting
that pointer addition is out of bounds.

Signed-off-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/158560428103.10843.6316594510312781186.stgit@john-Precision-5820-Tower
tools/testing/selftests/bpf/verifier/bounds.c

index 7c9b659..cf72fcc 100644 (file)
         *      [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff]
         */
        BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8),
-       /* no-op or OOB pointer computation */
+       /* error on OOB pointer computation */
        BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
-       /* potentially OOB access */
-       BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
        /* exit */
        BPF_MOV64_IMM(BPF_REG_0, 0),
        BPF_EXIT_INSN(),
        },
        .fixup_map_hash_8b = { 3 },
        /* not actually fully unbounded, but the bound is very high */
-       .errstr = "R0 unbounded memory access",
+       .errstr = "value 72057594021150720 makes map_value pointer be out of bounds",
        .result = REJECT
 },
 {
         *      [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff]
         */
        BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8),
-       /* no-op or OOB pointer computation */
+       /* error on OOB pointer computation */
        BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
-       /* potentially OOB access */
-       BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
        /* exit */
        BPF_MOV64_IMM(BPF_REG_0, 0),
        BPF_EXIT_INSN(),
        },
        .fixup_map_hash_8b = { 3 },
        /* not actually fully unbounded, but the bound is very high */
-       .errstr = "R0 unbounded memory access",
+       .errstr = "value 72057594021150720 makes map_value pointer be out of bounds",
        .result = REJECT
 },
 {