]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
selftests/bpf: Add test for narrow ctx load for pointer args
authorKumar Kartikeya Dwivedi <memxor@gmail.com>
Thu, 12 Dec 2024 09:20:50 +0000 (01:20 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 12 Dec 2024 19:40:18 +0000 (11:40 -0800)
Ensure that performing narrow ctx loads other than size == 8 are
rejected when the argument is a pointer type.

Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20241212092050.3204165-3-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c

index bfc3bf18fed4fefceec59bbbcc0a5c26207ab04c..28b939572cdadf2e3f0a19400629335921040bf6 100644 (file)
@@ -29,4 +29,40 @@ __naked void ctx_access_u32_pointer_accept(void)
 "      ::: __clobber_all);
 }
 
+SEC("fentry/bpf_fentry_test9")
+__description("btf_ctx_access u32 pointer reject u32")
+__failure __msg("size 4 must be 8")
+__naked void ctx_access_u32_pointer_reject_32(void)
+{
+       asm volatile ("                                 \
+       r2 = *(u32 *)(r1 + 0);          /* load 1st argument with narrow load */\
+       r0 = 0;                                         \
+       exit;                                           \
+"      ::: __clobber_all);
+}
+
+SEC("fentry/bpf_fentry_test9")
+__description("btf_ctx_access u32 pointer reject u16")
+__failure __msg("size 2 must be 8")
+__naked void ctx_access_u32_pointer_reject_16(void)
+{
+       asm volatile ("                                 \
+       r2 = *(u16 *)(r1 + 0);          /* load 1st argument with narrow load */\
+       r0 = 0;                                         \
+       exit;                                           \
+"      ::: __clobber_all);
+}
+
+SEC("fentry/bpf_fentry_test9")
+__description("btf_ctx_access u32 pointer reject u8")
+__failure __msg("size 1 must be 8")
+__naked void ctx_access_u32_pointer_reject_8(void)
+{
+       asm volatile ("                                 \
+       r2 = *(u8 *)(r1 + 0);           /* load 1st argument with narrow load */\
+       r0 = 0;                                         \
+       exit;                                           \
+"      ::: __clobber_all);
+}
+
 char _license[] SEC("license") = "GPL";