xref: /linux/tools/testing/selftests/bpf/progs/verifier_ptr_to_buf.c (revision fab183d632628381b466a41479489541ac0e29a0)
1*6f59deb3SSun Jian // SPDX-License-Identifier: GPL-2.0
2*6f59deb3SSun Jian 
3*6f59deb3SSun Jian #include <vmlinux.h>
4*6f59deb3SSun Jian #include <bpf/bpf_helpers.h>
5*6f59deb3SSun Jian #include "bpf_misc.h"
6*6f59deb3SSun Jian 
7*6f59deb3SSun Jian SEC("iter/bpf_map_elem")
8*6f59deb3SSun Jian __description("PTR_TO_BUF: reject negative const offset")
9*6f59deb3SSun Jian __failure
10*6f59deb3SSun Jian __msg("invalid negative rdwr buffer offset")
ptr_to_buf_reject_negative_const_offset(void)11*6f59deb3SSun Jian __naked void ptr_to_buf_reject_negative_const_offset(void)
12*6f59deb3SSun Jian {
13*6f59deb3SSun Jian 	asm volatile ("r0 = 0;					\
14*6f59deb3SSun Jian 	 r2 = *(u64 *)(r1 + %[value_off]);			\
15*6f59deb3SSun Jian 	 if r2 == 0 goto l0_%=;					\
16*6f59deb3SSun Jian 	 r2 += -8;						\
17*6f59deb3SSun Jian 	 r0 = *(u64 *)(r2 + 0);					\
18*6f59deb3SSun Jian l0_%=:								\
19*6f59deb3SSun Jian 	 exit;							\
20*6f59deb3SSun Jian 	"
21*6f59deb3SSun Jian 	:
22*6f59deb3SSun Jian 	: __imm_const(value_off,
23*6f59deb3SSun Jian 		      offsetof(struct bpf_iter__bpf_map_elem, value))
24*6f59deb3SSun Jian 	: __clobber_all);
25*6f59deb3SSun Jian }
26*6f59deb3SSun Jian 
27*6f59deb3SSun Jian char _license[] SEC("license") = "GPL";
28