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