aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/bpf
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@kernel.org>2025-10-01 13:53:20 -0700
committerAlexei Starovoitov <ast@kernel.org>2025-10-01 13:55:08 -0700
commita1aca22d264cdca5b20934a2413951ea7d73c594 (patch)
tree761496156250d09e0e9d9294da0b21752c461878 /tools/testing/selftests/bpf
parentselftests/bpf: Fix realloc size in bpf_get_addrs (diff)
parentselftests/bpf: Add test for BPF_NEG alu on CONST_PTR_TO_MAP (diff)
downloadlinux-a1aca22d264cdca5b20934a2413951ea7d73c594.tar.gz
linux-a1aca22d264cdca5b20934a2413951ea7d73c594.zip
Merge branch 'bpf-fix-verifier-crash-on-bpf_neg-with-pointer-register'
Brahmajit Das says: ==================== bpf: Fix verifier crash on BPF_NEG with pointer register This patch fixes a crash in the BPF verifier triggered when the BPF_NEG operation is applied to a pointer-typed register. The verifier now checks that the destination register is not a pointer before performing the operation. Tested with syzkaller reproducer and new BPF sefltest. Closes: https://syzkaller.appspot.com/bug?extid=d36d5ae81e1b0a53ef58 Changes v4: Cleaning up, instead of using __is_pointer_value it's further simplified by checking if regs[insn->dst_reg].type of SCALAR_VALUE Link: Changes in v3: using __is_pointer_value to check if register if of pointer type Link: https://lore.kernel.org/all/20251001095613.267475-1-listout@listout.xyz/ Changes in v2: Checking if reg->map_ptr is NULL in bpf/log.c but with cleaner approach (wrong approach) Link: https://lore.kernel.org/all/20250923174738.1713751-1-listout@listout.xyz/ Changes in v1: Checking if reg->map_ptr is NULL in bpf/log.c (wrong approach) Link: https://lore.kernel.org/all/20250923164144.1573636-1-listout@listout.xyz/ ==================== Link: https://patch.msgid.link/20251001191739.2323644-1-listout@listout.xyz Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'tools/testing/selftests/bpf')
-rw-r--r--tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c b/tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c
index a9ab37d3b9e2..dcaab61a11a0 100644
--- a/tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c
+++ b/tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c
@@ -146,6 +146,24 @@ l0_%=: exit; \
: __clobber_all);
}
+SEC("socket")
+__description("map_ptr illegal alu op, map_ptr = -map_ptr")
+__failure __msg("R0 invalid mem access 'scalar'")
+__failure_unpriv __msg_unpriv("R0 pointer arithmetic prohibited")
+__flag(BPF_F_ANY_ALIGNMENT)
+__naked void map_ptr_illegal_alu_op(void)
+{
+ asm volatile (" \
+ r0 = %[map_hash_48b] ll; \
+ r0 = -r0; \
+ r1 = 22; \
+ *(u64*)(r0 + 0) = r1; \
+ exit; \
+" :
+ : __imm_addr(map_hash_48b)
+ : __clobber_all);
+}
+
SEC("flow_dissector")
__description("flow_keys illegal alu op with variable offset")
__failure __msg("R7 pointer arithmetic on flow_keys prohibited")