Skip to content

Commit

Permalink
bpf: Add AND verifier test case where 32bit and 64bit bounds differ
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
John Fastabend authored and Alexei Starovoitov committed Sep 25, 2020
1 parent 4fbb38a commit 99d4def
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions tools/testing/selftests/bpf/verifier/and.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,19 @@
.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
},

0 comments on commit 99d4def

Please sign in to comment.