selftests/bpf: MUL range computation tests.
authorCupertino Miranda <cupertino.miranda@oracle.com>
Mon, 6 May 2024 14:18:49 +0000 (15:18 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 7 May 2024 00:09:12 +0000 (17:09 -0700)
Added a test for bound computation in MUL when non constant
values are used and both registers have bounded ranges.

Signed-off-by: Cupertino Miranda <cupertino.miranda@oracle.com>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Acked-by: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Yonghong Song <yonghong.song@linux.dev>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: David Faust <david.faust@oracle.com>
Cc: Jose Marchesi <jose.marchesi@oracle.com>
Cc: Elena Zannoni <elena.zannoni@oracle.com>
Link: https://lore.kernel.org/r/20240506141849.185293-7-cupertino.miranda@oracle.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/verifier_bounds.c

index 7d570ac..a0bb7fb 100644 (file)
@@ -927,6 +927,27 @@ __naked void non_const_or_src_dst(void)
        : __clobber_all);
 }
 
+SEC("socket")
+__description("bounds check for non const mul regs")
+__success __log_level(2)
+__msg("5: (2f) r0 *= r6                      ; R0_w=scalar(smin=smin32=0,smax=umax=smax32=umax32=3825,var_off=(0x0; 0xfff))")
+__naked void non_const_mul_regs(void)
+{
+       asm volatile ("                                 \
+       call %[bpf_get_prandom_u32];                    \
+       r6 = r0;                                        \
+       call %[bpf_get_prandom_u32];                    \
+       r6 &= 0xff;                                     \
+       r0 &= 0x0f;                                     \
+       r0 *= r6;                                       \
+       exit;                                           \
+"      :
+       : __imm(bpf_map_lookup_elem),
+       __imm_addr(map_hash_8b),
+       __imm(bpf_get_prandom_u32)
+       : __clobber_all);
+}
+
 SEC("socket")
 __description("bounds checks after 32-bit truncation. test 1")
 __success __failure_unpriv __msg_unpriv("R0 leaks addr")