]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/bpf: Add tests for unaligned syscall ctx accesses
authorKumar Kartikeya Dwivedi <memxor@gmail.com>
Mon, 6 Apr 2026 19:44:00 +0000 (21:44 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 6 Apr 2026 22:27:27 +0000 (15:27 -0700)
Add coverage for unaligned access with fixed offsets and variable
offsets, and through helpers or kfuncs.

Reviewed-by: Emil Tsalapatis <emil@etsalapatis.com>
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20260406194403.1649608-7-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/verifier_ctx.c

index 6e683dd8002a702b477708b9f72e8883ac8b8e65..887cd07ed8855216e1146434cd2511f4c65dd11a 100644 (file)
@@ -320,6 +320,30 @@ int syscall_ctx_fixed_off_read(void *ctx)
        return 0;
 }
 
+SEC("?syscall")
+__description("syscall: unaligned read ctx with fixed offset")
+__success
+int syscall_ctx_unaligned_fixed_off_read(void *ctx)
+{
+       char *p = ctx;
+       volatile __u32 val;
+
+       val = *(__u32 *)(p + 2);
+       (void)val;
+       return 0;
+}
+
+SEC("?syscall")
+__description("syscall: unaligned write ctx with fixed offset")
+__success
+int syscall_ctx_unaligned_fixed_off_write(void *ctx)
+{
+       char *p = ctx;
+
+       *(__u32 *)(p + 2) = 0;
+       return 0;
+}
+
 SEC("?syscall")
 __description("syscall: read ctx with variable offset")
 __success
@@ -350,6 +374,38 @@ int syscall_ctx_var_off_write(void *ctx)
        return 0;
 }
 
+SEC("?syscall")
+__description("syscall: unaligned read ctx with variable offset")
+__success
+int syscall_ctx_unaligned_var_off_read(void *ctx)
+{
+       __u64 off = bpf_get_prandom_u32();
+       char *p = ctx;
+       volatile __u32 val;
+
+       off &= 0xfc;
+       off += 2;
+       p += off;
+       val = *(__u32 *)p;
+       (void)val;
+       return 0;
+}
+
+SEC("?syscall")
+__description("syscall: unaligned write ctx with variable offset")
+__success
+int syscall_ctx_unaligned_var_off_write(void *ctx)
+{
+       __u64 off = bpf_get_prandom_u32();
+       char *p = ctx;
+
+       off &= 0xfc;
+       off += 2;
+       p += off;
+       *(__u32 *)p = 0;
+       return 0;
+}
+
 SEC("?syscall")
 __description("syscall: reject negative variable offset ctx access")
 __failure __msg("min value is negative")
@@ -398,6 +454,28 @@ int syscall_ctx_helper_fixed_off_write(void *ctx)
        return bpf_probe_read_kernel(p, 4, 0);
 }
 
+SEC("?syscall")
+__description("syscall: helper unaligned read ctx with fixed offset")
+__success
+int syscall_ctx_helper_unaligned_fixed_off_read(void *ctx)
+{
+       char *p = ctx;
+
+       p += 2;
+       return bpf_strncmp(p, 4, ctx_strncmp_target);
+}
+
+SEC("?syscall")
+__description("syscall: helper unaligned write ctx with fixed offset")
+__success
+int syscall_ctx_helper_unaligned_fixed_off_write(void *ctx)
+{
+       char *p = ctx;
+
+       p += 2;
+       return bpf_probe_read_kernel(p, 4, 0);
+}
+
 SEC("?syscall")
 __description("syscall: helper read ctx with variable offset")
 __success
@@ -424,6 +502,34 @@ int syscall_ctx_helper_var_off_write(void *ctx)
        return bpf_probe_read_kernel(p, 4, 0);
 }
 
+SEC("?syscall")
+__description("syscall: helper unaligned read ctx with variable offset")
+__success
+int syscall_ctx_helper_unaligned_var_off_read(void *ctx)
+{
+       __u64 off = bpf_get_prandom_u32();
+       char *p = ctx;
+
+       off &= 0xfc;
+       off += 2;
+       p += off;
+       return bpf_strncmp(p, 4, ctx_strncmp_target);
+}
+
+SEC("?syscall")
+__description("syscall: helper unaligned write ctx with variable offset")
+__success
+int syscall_ctx_helper_unaligned_var_off_write(void *ctx)
+{
+       __u64 off = bpf_get_prandom_u32();
+       char *p = ctx;
+
+       off &= 0xfc;
+       off += 2;
+       p += off;
+       return bpf_probe_read_kernel(p, 4, 0);
+}
+
 SEC("?syscall")
 __description("syscall: helper read zero-sized ctx access")
 __success
@@ -466,6 +572,33 @@ int syscall_ctx_kfunc_var_off(void *ctx)
        return 0;
 }
 
+SEC("?syscall")
+__description("syscall: kfunc unaligned access ctx with fixed offset")
+__success
+int syscall_ctx_kfunc_unaligned_fixed_off(void *ctx)
+{
+       char *p = ctx;
+
+       p += 2;
+       bpf_kfunc_call_test_mem_len_pass1(p, 4);
+       return 0;
+}
+
+SEC("?syscall")
+__description("syscall: kfunc unaligned access ctx with variable offset")
+__success
+int syscall_ctx_kfunc_unaligned_var_off(void *ctx)
+{
+       __u64 off = bpf_get_prandom_u32();
+       char *p = ctx;
+
+       off &= 0xfc;
+       off += 2;
+       p += off;
+       bpf_kfunc_call_test_mem_len_pass1(p, 4);
+       return 0;
+}
+
 SEC("?syscall")
 __description("syscall: kfunc access zero-sized ctx")
 __success