]> www.infradead.org Git - users/hch/misc.git/commitdiff
selftests/bpf: Add test case for delta propagation
authorDaniel Borkmann <daniel@iogearbox.net>
Wed, 16 Oct 2024 13:49:13 +0000 (15:49 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Thu, 17 Oct 2024 18:06:34 +0000 (11:06 -0700)
Add a small BPF verifier test case to ensure that alu32 additions to
registers are not subject to linked scalar delta tracking.

  # ./vmtest.sh -- ./test_progs -t verifier_linked_scalars
  [...]
  ./test_progs -t verifier_linked_scalars
  [    1.413138] tsc: Refined TSC clocksource calibration: 3407.993 MHz
  [    1.413524] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x311fcd52370, max_idle_ns: 440795242006 ns
  [    1.414223] clocksource: Switched to clocksource tsc
  [    1.419640] bpf_testmod: loading out-of-tree module taints kernel.
  [    1.420025] bpf_testmod: module verification failed: signature and/or required key missing - tainting kernel
  #500/1   verifier_linked_scalars/scalars: find linked scalars:OK
  #500     verifier_linked_scalars:OK
  Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED
  [    1.590858] ACPI: PM: Preparing to enter system sleep state S5
  [    1.591402] reboot: Power down
  [...]

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/20241016134913.32249-3-daniel@iogearbox.net
tools/testing/selftests/bpf/prog_tests/verifier.c
tools/testing/selftests/bpf/progs/verifier_linked_scalars.c [new file with mode: 0644]

index e26b5150fc43403a834a0564229472b3257acf45..5356f26bbb3f8c889061e40be4ce280bc8770927 100644 (file)
@@ -44,6 +44,7 @@
 #include "verifier_ld_ind.skel.h"
 #include "verifier_ldsx.skel.h"
 #include "verifier_leak_ptr.skel.h"
+#include "verifier_linked_scalars.skel.h"
 #include "verifier_loops1.skel.h"
 #include "verifier_lwt.skel.h"
 #include "verifier_map_in_map.skel.h"
@@ -170,6 +171,7 @@ void test_verifier_jit_convergence(void)      { RUN(verifier_jit_convergence); }
 void test_verifier_ld_ind(void)               { RUN(verifier_ld_ind); }
 void test_verifier_ldsx(void)                  { RUN(verifier_ldsx); }
 void test_verifier_leak_ptr(void)             { RUN(verifier_leak_ptr); }
+void test_verifier_linked_scalars(void)       { RUN(verifier_linked_scalars); }
 void test_verifier_loops1(void)               { RUN(verifier_loops1); }
 void test_verifier_lwt(void)                  { RUN(verifier_lwt); }
 void test_verifier_map_in_map(void)           { RUN(verifier_map_in_map); }
diff --git a/tools/testing/selftests/bpf/progs/verifier_linked_scalars.c b/tools/testing/selftests/bpf/progs/verifier_linked_scalars.c
new file mode 100644 (file)
index 0000000..8f755d2
--- /dev/null
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+#include "bpf_misc.h"
+
+SEC("socket")
+__description("scalars: find linked scalars")
+__failure
+__msg("math between fp pointer and 2147483647 is not allowed")
+__naked void scalars(void)
+{
+       asm volatile ("                         \
+       r0 = 0;                                 \
+       r1 = 0x80000001 ll;                     \
+       r1 /= 1;                                \
+       r2 = r1;                                \
+       r4 = r1;                                \
+       w2 += 0x7FFFFFFF;                       \
+       w4 += 0;                                \
+       if r2 == 0 goto l1;                     \
+       exit;                                   \
+l1:                                            \
+       r4 >>= 63;                              \
+       r3 = 1;                                 \
+       r3 -= r4;                               \
+       r3 *= 0x7FFFFFFF;                       \
+       r3 += r10;                              \
+       *(u8*)(r3 - 1) = r0;                    \
+       exit;                                   \
+"      ::: __clobber_all);
+}
+
+char _license[] SEC("license") = "GPL";