selftests/bpf: check if verifier tracks constants spilled by BPF_ST_MEM
authorEduard Zingerman <eddyz87@gmail.com>
Tue, 14 Feb 2023 23:20:28 +0000 (01:20 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 15 Feb 2023 19:48:47 +0000 (11:48 -0800)
Check that verifier tracks the value of 'imm' spilled to stack by
BPF_ST_MEM instruction. Cover the following cases:
- write of non-zero constant to stack;
- write of a zero constant to stack.

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20230214232030.1502829-3-eddyz87@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/verifier/bpf_st_mem.c [new file with mode: 0644]

diff --git a/tools/testing/selftests/bpf/verifier/bpf_st_mem.c b/tools/testing/selftests/bpf/verifier/bpf_st_mem.c
new file mode 100644 (file)
index 0000000..932903f
--- /dev/null
@@ -0,0 +1,37 @@
+{
+       "BPF_ST_MEM stack imm non-zero",
+       .insns = {
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 42),
+       BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, -42),
+       /* if value is tracked correctly R0 is zero */
+       BPF_EXIT_INSN(),
+       },
+       .result = ACCEPT,
+       /* Use prog type that requires return value in range [0, 1] */
+       .prog_type = BPF_PROG_TYPE_SK_LOOKUP,
+       .expected_attach_type = BPF_SK_LOOKUP,
+       .runs = -1,
+},
+{
+       "BPF_ST_MEM stack imm zero",
+       .insns = {
+       /* mark stack 0000 0000 */
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       /* read and sum a few bytes */
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_10, -8),
+       BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
+       BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_10, -4),
+       BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
+       BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_10, -1),
+       BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
+       /* if value is tracked correctly R0 is zero */
+       BPF_EXIT_INSN(),
+       },
+       .result = ACCEPT,
+       /* Use prog type that requires return value in range [0, 1] */
+       .prog_type = BPF_PROG_TYPE_SK_LOOKUP,
+       .expected_attach_type = BPF_SK_LOOKUP,
+       .runs = -1,
+},