Skip to content

Commit ca796fe

Browse files
borkmannAlexei Starovoitov
authored andcommitted
bpf, selftests: Add verifier test for mem_or_null register with offset.
Add a new test case with mem_or_null typed register with off > 0 to ensure it gets rejected by the verifier: # ./test_verifier 1011 #1009/u check with invalid reg offset 0 OK #1009/p check with invalid reg offset 0 OK Summary: 2 PASSED, 0 SKIPPED, 0 FAILED Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent e60b0d1 commit ca796fe

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

tools/testing/selftests/bpf/verifier/spill_fill.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,34 @@
5858
.result = ACCEPT,
5959
.result_unpriv = ACCEPT,
6060
},
61+
{
62+
"check with invalid reg offset 0",
63+
.insns = {
64+
/* reserve 8 byte ringbuf memory */
65+
BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
66+
BPF_LD_MAP_FD(BPF_REG_1, 0),
67+
BPF_MOV64_IMM(BPF_REG_2, 8),
68+
BPF_MOV64_IMM(BPF_REG_3, 0),
69+
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_reserve),
70+
/* store a pointer to the reserved memory in R6 */
71+
BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
72+
/* add invalid offset to memory or NULL */
73+
BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
74+
/* check whether the reservation was successful */
75+
BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
76+
/* should not be able to access *(R7) = 0 */
77+
BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0),
78+
/* submit the reserved ringbuf memory */
79+
BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
80+
BPF_MOV64_IMM(BPF_REG_2, 0),
81+
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_submit),
82+
BPF_MOV64_IMM(BPF_REG_0, 0),
83+
BPF_EXIT_INSN(),
84+
},
85+
.fixup_map_ringbuf = { 1 },
86+
.result = REJECT,
87+
.errstr = "R0 pointer arithmetic on mem_or_null prohibited",
88+
},
6189
{
6290
"check corrupted spill/fill",
6391
.insns = {

0 commit comments

Comments
 (0)