]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Add test for stale bounds on LSM retval context load
authorTristan Madani <tristan@talencesecurity.com>
Mon, 22 Jun 2026 23:01:23 +0000 (23:01 +0000)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 23 Jun 2026 00:11:46 +0000 (17:11 -0700)
Add a verifier test that catches the stale-bounds issue fixed in the
previous patch. The test sets r6 = 0 to create known bounds, then loads
the LSM hook return value into r6 from the context. Without the fix,
the verifier intersects the retval range with the stale bounds and
incorrectly narrows r6 to a single value, pruning the fall-through
branch as dead code and missing the div-by-zero.

Suggested-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Tristan Madani <tristan@talencesecurity.com>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20260622230123.3695446-3-tristmd@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/verifier_lsm.c

index 2f8103bfa14e5af4838e50d4d03bc076b93b0a8b..c724bf389f5c65423c1f43b6526d7c589403020c 100644 (file)
@@ -197,4 +197,19 @@ int BPF_PROG(sleepable_lsm_cgroup)
        return 0;
 }
 
+SEC("lsm/file_mprotect")
+__description("lsm retval load must reset stale register bounds")
+__failure __msg("div by zero")
+__naked int retval_load_resets_bounds(void *ctx)
+{
+       asm volatile (
+       "r6 = 0;"
+       "r6 = *(u64 *)(r1 + 24);"
+       "if r6 == 0 goto +1;"
+       "r6 /= 0;"
+       "r0 = 0;"
+       "exit;"
+       ::: __clobber_all);
+}
+
 char _license[] SEC("license") = "GPL";