xref: /linux/tools/testing/selftests/bpf/progs/verifier_set_retval.c (revision b2128290c29902315e632ea59e0504d6bc9e9b42)
1*7913cdb5SXu Kuohai // SPDX-License-Identifier: GPL-2.0
2*7913cdb5SXu Kuohai 
3*7913cdb5SXu Kuohai #include <linux/bpf.h>
4*7913cdb5SXu Kuohai #include <bpf/bpf_helpers.h>
5*7913cdb5SXu Kuohai #include <bpf/bpf_tracing.h>
6*7913cdb5SXu Kuohai #include "bpf_misc.h"
7*7913cdb5SXu Kuohai 
8*7913cdb5SXu Kuohai SEC("lsm_cgroup/socket_create")
9*7913cdb5SXu Kuohai __description("lsm_cgroup bpf_set_retval success")
10*7913cdb5SXu Kuohai __success
11*7913cdb5SXu Kuohai int BPF_PROG(lsm_cgroup_set_retval_zero_valid, int family, int type, int protocol, int kern)
12*7913cdb5SXu Kuohai {
13*7913cdb5SXu Kuohai 	bpf_set_retval(0);
14*7913cdb5SXu Kuohai 	return 0;
15*7913cdb5SXu Kuohai }
16*7913cdb5SXu Kuohai 
17*7913cdb5SXu Kuohai SEC("lsm_cgroup/socket_create")
18*7913cdb5SXu Kuohai __description("lsm_cgroup bpf_set_retval valid errno")
19*7913cdb5SXu Kuohai __success
20*7913cdb5SXu Kuohai int BPF_PROG(lsm_cgroup_set_retval_negative_valid, int family, int type, int protocol, int kern)
21*7913cdb5SXu Kuohai {
22*7913cdb5SXu Kuohai 	bpf_set_retval(-12);
23*7913cdb5SXu Kuohai 	return 0;
24*7913cdb5SXu Kuohai }
25*7913cdb5SXu Kuohai 
26*7913cdb5SXu Kuohai SEC("lsm_cgroup/socket_create")
27*7913cdb5SXu Kuohai __description("lsm_cgroup bpf_set_retval invalid negative value")
28*7913cdb5SXu Kuohai __failure __msg("should have been in [-4095, 0]")
29*7913cdb5SXu Kuohai int BPF_PROG(lsm_cgroup_set_retval_negative_invalid, int family, int type, int protocol, int kern)
30*7913cdb5SXu Kuohai {
31*7913cdb5SXu Kuohai 	bpf_set_retval(-4096);
32*7913cdb5SXu Kuohai 	return 0;
33*7913cdb5SXu Kuohai }
34*7913cdb5SXu Kuohai 
35*7913cdb5SXu Kuohai SEC("lsm_cgroup/socket_create")
36*7913cdb5SXu Kuohai __description("lsm_cgroup bpf_set_retval invalid positive value")
37*7913cdb5SXu Kuohai __failure __msg("should have been in [-4095, 0]")
38*7913cdb5SXu Kuohai int BPF_PROG(lsm_cgroup_set_retval_positive_invalid, int family, int type, int protocol, int kern)
39*7913cdb5SXu Kuohai {
40*7913cdb5SXu Kuohai 	bpf_set_retval(1);
41*7913cdb5SXu Kuohai 	return 0;
42*7913cdb5SXu Kuohai }
43*7913cdb5SXu Kuohai 
44*7913cdb5SXu Kuohai SEC("cgroup/dev")
45*7913cdb5SXu Kuohai __description("cgroup_device bpf_set_retval success")
46*7913cdb5SXu Kuohai __success
47*7913cdb5SXu Kuohai int cgroup_dev_set_retval_0(struct bpf_cgroup_dev_ctx *ctx)
48*7913cdb5SXu Kuohai {
49*7913cdb5SXu Kuohai 	bpf_set_retval(0);
50*7913cdb5SXu Kuohai 	return 1;
51*7913cdb5SXu Kuohai }
52*7913cdb5SXu Kuohai 
53*7913cdb5SXu Kuohai SEC("cgroup/dev")
54*7913cdb5SXu Kuohai __description("cgroup_device bpf_set_retval valid errno")
55*7913cdb5SXu Kuohai __success
56*7913cdb5SXu Kuohai int cgroup_dev_set_retval_neg_maxerrno(struct bpf_cgroup_dev_ctx *ctx)
57*7913cdb5SXu Kuohai {
58*7913cdb5SXu Kuohai 	bpf_set_retval(-4095);
59*7913cdb5SXu Kuohai 	return 1;
60*7913cdb5SXu Kuohai }
61*7913cdb5SXu Kuohai 
62*7913cdb5SXu Kuohai SEC("cgroup/dev")
63*7913cdb5SXu Kuohai __description("cgroup_device bpf_set_retval invalid positive value")
64*7913cdb5SXu Kuohai __failure __msg("should have been in [-4095, 0]")
65*7913cdb5SXu Kuohai int cgroup_dev_set_retval_1(struct bpf_cgroup_dev_ctx *ctx)
66*7913cdb5SXu Kuohai {
67*7913cdb5SXu Kuohai 	bpf_set_retval(1);
68*7913cdb5SXu Kuohai 	return 1;
69*7913cdb5SXu Kuohai }
70*7913cdb5SXu Kuohai 
71*7913cdb5SXu Kuohai SEC("cgroup/dev")
72*7913cdb5SXu Kuohai __description("cgroup_device bpf_set_retval invalid negative value")
73*7913cdb5SXu Kuohai __failure __msg("should have been in [-4095, 0]")
74*7913cdb5SXu Kuohai int cgroup_dev_set_retval_neg_4096(struct bpf_cgroup_dev_ctx *ctx)
75*7913cdb5SXu Kuohai {
76*7913cdb5SXu Kuohai 	bpf_set_retval(-4096);
77*7913cdb5SXu Kuohai 	return 1;
78*7913cdb5SXu Kuohai }
79*7913cdb5SXu Kuohai 
80*7913cdb5SXu Kuohai SEC("cgroup/dev")
81*7913cdb5SXu Kuohai __description("bpf_set_retval bounds check survives state pruning")
82*7913cdb5SXu Kuohai __failure __msg("should have been in [-4095, 0]")
83*7913cdb5SXu Kuohai __naked int cgroup_dev_set_retval_pruning_bypass(struct bpf_cgroup_dev_ctx *ctx)
84*7913cdb5SXu Kuohai {
85*7913cdb5SXu Kuohai 	asm volatile (
86*7913cdb5SXu Kuohai 		"call %[bpf_get_prandom_u32];"
87*7913cdb5SXu Kuohai 		"if r0 != 0 goto 1f;"
88*7913cdb5SXu Kuohai 		"r0 = r0;"
89*7913cdb5SXu Kuohai 		"r0 = r0;"
90*7913cdb5SXu Kuohai 		"r0 = r0;"
91*7913cdb5SXu Kuohai 		"r0 = r0;"
92*7913cdb5SXu Kuohai 		"goto 2f;"
93*7913cdb5SXu Kuohai 	"1:"
94*7913cdb5SXu Kuohai 		"call %[bpf_get_prandom_u32];"
95*7913cdb5SXu Kuohai 	"2:"
96*7913cdb5SXu Kuohai 		"r1 = r0;"
97*7913cdb5SXu Kuohai 		"call %[bpf_set_retval];"
98*7913cdb5SXu Kuohai 		"r0 = 1;"
99*7913cdb5SXu Kuohai 		"exit;"
100*7913cdb5SXu Kuohai 		:
101*7913cdb5SXu Kuohai 		: __imm(bpf_get_prandom_u32),
102*7913cdb5SXu Kuohai 		  __imm(bpf_set_retval)
103*7913cdb5SXu Kuohai 		: __clobber_common
104*7913cdb5SXu Kuohai 	);
105*7913cdb5SXu Kuohai }
106*7913cdb5SXu Kuohai 
107*7913cdb5SXu Kuohai char _license[] SEC("license") = "GPL";
108