]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests/bpf: bpf_rdonly_cast u{8,16,32,64} access tests
authorEduard Zingerman <eddyz87@gmail.com>
Fri, 27 Jun 2025 01:55:39 +0000 (18:55 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 28 Jun 2025 01:55:28 +0000 (18:55 -0700)
Tests with aligned and misaligned memory access of different sizes via
pointer returned by bpf_rdonly_cast().

Suggested-by: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20250627015539.1439656-1-eddyz87@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/mem_rdonly_untrusted.c

index 00604755e69877aea952ae82dbdd7f38109a2365..b0486af36f55053ac3f450dbb076365ecd569109 100644 (file)
@@ -133,4 +133,45 @@ int mixed_mem_type(void *ctx)
        return *p;
 }
 
+__attribute__((__aligned__(8)))
+u8 global[] = {
+       0x11, 0x22, 0x33, 0x44,
+       0x55, 0x66, 0x77, 0x88,
+       0x99
+};
+
+__always_inline
+static u64 combine(void *p)
+{
+       u64 acc;
+
+       acc = 0;
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+       acc |= (*(u64 *)p >> 56) << 24;
+       acc |= (*(u32 *)p >> 24) << 16;
+       acc |= (*(u16 *)p >> 8)  << 8;
+       acc |= *(u8 *)p;
+#else
+       acc |= (*(u64 *)p & 0xff) << 24;
+       acc |= (*(u32 *)p & 0xff) << 16;
+       acc |= (*(u16 *)p & 0xff) << 8;
+       acc |= *(u8 *)p;
+#endif
+       return acc;
+}
+
+SEC("socket")
+__retval(0x88442211)
+int diff_size_access(void *ctx)
+{
+       return combine(bpf_rdonly_cast(&global, 0));
+}
+
+SEC("socket")
+__retval(0x99553322)
+int misaligned_access(void *ctx)
+{
+       return combine(bpf_rdonly_cast(&global, 0) + 1);
+}
+
 char _license[] SEC("license") = "GPL";