bpf: Add AND verifier test case where 32bit and 64bit bounds differ
authorJohn Fastabend <john.fastabend@gmail.com>
Thu, 24 Sep 2020 18:45:22 +0000 (11:45 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 25 Sep 2020 23:47:21 +0000 (16:47 -0700)
If we AND two values together that are known in the 32bit subregs, but not
known in the 64bit registers we rely on the tnum value to report the 32bit
subreg is known. And do not use mark_reg_known() directly from
scalar32_min_max_and()

Add an AND test to cover the case with known 32bit subreg, but unknown
64bit reg.

Signed-off-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/verifier/and.c

index d781bc86e1000f2a03b6bad62bc956b575df0a90..ca8fdb1b3f0154dc6eb698e89648c2a0b6c87b64 100644 (file)
        .result = REJECT,
        .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
+{
+       "check known subreg with unknown reg",
+       .insns = {
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
+       BPF_ALU64_IMM(BPF_LSH, BPF_REG_0, 32),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
+       BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xFFFF1234),
+       /* Upper bits are unknown but AND above masks out 1 zero'ing lower bits */
+       BPF_JMP32_IMM(BPF_JLT, BPF_REG_0, 1, 1),
+       BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 512),
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .result = ACCEPT,
+       .retval = 0
+},