From: Eduard Zingerman <[email protected]>

Verify that infinite loop detection logic separates states with
identical register states but different imprecise scalars spilled to
stack.

Signed-off-by: Eduard Zingerman <[email protected]>
---
 .../selftests/bpf/progs/verifier_loops1.c     | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/tools/testing/selftests/bpf/progs/verifier_loops1.c 
b/tools/testing/selftests/bpf/progs/verifier_loops1.c
index 71735dbf33d4..e07b43b78fd2 100644
--- a/tools/testing/selftests/bpf/progs/verifier_loops1.c
+++ b/tools/testing/selftests/bpf/progs/verifier_loops1.c
@@ -259,4 +259,28 @@ l0_%=:     r2 += r1;                                       
\
 "      ::: __clobber_all);
 }
 
+SEC("xdp")
+__success
+__naked void not_an_inifinite_loop(void)
+{
+       asm volatile ("                                 \
+       call %[bpf_get_prandom_u32];                    \
+       r0 &= 0xff;                                     \
+       *(u64 *)(r10 - 8) = r0;                         \
+       r0 = 0;                                         \
+loop_%=:                                               \
+       r0 = *(u64 *)(r10 - 8);                         \
+       if r0 > 10 goto exit_%=;                        \
+       r0 += 1;                                        \
+       *(u64 *)(r10 - 8) = r0;                         \
+       r0 = 0;                                         \
+       goto loop_%=;                                   \
+exit_%=:                                               \
+       r0 = 0;                                         \
+       exit;                                           \
+"      :
+       : __imm(bpf_get_prandom_u32)
+       : __clobber_all);
+}
+
 char _license[] SEC("license") = "GPL";
-- 
2.42.1


Reply via email to