[PATCH bpf-next 4/5] selftests/bpf: Test trusted-or-null linux_binprm->mm
From: Anastasios Papagiannis
Date: Tue Aug 11 2026 - 07:24:14 EST
Add verifier coverage for the linux_binprm->mm trusted-or-null
annotation. Verify that bpf_copy_from_user_mm() accepts the pointer
after a NULL check and rejects it without one.
Signed-off-by: Anastasios Papagiannis <tasos.papagiannnis@xxxxxxxxx>
---
.../selftests/bpf/progs/verifier_lsm.c | 31 +++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/tools/testing/selftests/bpf/progs/verifier_lsm.c b/tools/testing/selftests/bpf/progs/verifier_lsm.c
index c724bf389f5c..4fc835432af0 100644
--- a/tools/testing/selftests/bpf/progs/verifier_lsm.c
+++ b/tools/testing/selftests/bpf/progs/verifier_lsm.c
@@ -5,6 +5,10 @@
#include <bpf/bpf_tracing.h>
#include "bpf_misc.h"
+extern int bpf_copy_from_user_mm(void *dst, u32 dst__sz,
+ const void *unsafe_ptr__ign,
+ struct mm_struct *mm, u64 flags) __ksym;
+
SEC("lsm/file_permission")
__description("lsm bpf prog with -4095~0 retval. test 1")
__success
@@ -212,4 +216,31 @@ __naked int retval_load_resets_bounds(void *ctx)
::: __clobber_all);
}
+SEC("lsm.s/bprm_check_security")
+__description("null checking trusted-or-null linux_binprm mm")
+__success
+int BPF_PROG(copy_from_user_mm_with_null_check, struct linux_binprm *bprm, int ret)
+{
+ struct mm_struct *mm;
+ char dst[8];
+
+ mm = bprm->mm;
+ if (!mm)
+ return 0;
+
+ bpf_copy_from_user_mm(dst, sizeof(dst), (void *)bprm->p, mm, 0);
+ return 0;
+}
+
+SEC("lsm.s/bprm_check_security")
+__description("not null checking trusted-or-null linux_binprm mm")
+__failure __msg("Possibly NULL pointer passed to trusted R4")
+int BPF_PROG(copy_from_user_mm_without_null_check, struct linux_binprm *bprm, int ret)
+{
+ char dst[8];
+
+ bpf_copy_from_user_mm(dst, sizeof(dst), (void *)bprm->p, bprm->mm, 0);
+ return 0;
+}
+
char _license[] SEC("license") = "GPL";
--
2.55.0