156 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Converted from tools/testing/selftests/bpf/verifier/int_ptr.c */3 4#include <linux/bpf.h>5#include <bpf/bpf_helpers.h>6#include "bpf_misc.h"7 8SEC("socket")9__description("arg pointer to long uninitialized")10__success11__naked void arg_ptr_to_long_uninitialized(void)12{13 asm volatile (" \14 /* bpf_strtoul arg1 (buf) */ \15 r7 = r10; \16 r7 += -8; \17 r0 = 0x00303036; \18 *(u64*)(r7 + 0) = r0; \19 r1 = r7; \20 /* bpf_strtoul arg2 (buf_len) */ \21 r2 = 4; \22 /* bpf_strtoul arg3 (flags) */ \23 r3 = 0; \24 /* bpf_strtoul arg4 (res) */ \25 r7 += -8; \26 r4 = r7; \27 /* bpf_strtoul() */ \28 call %[bpf_strtoul]; \29 r0 = 1; \30 exit; \31" :32 : __imm(bpf_strtoul)33 : __clobber_all);34}35 36SEC("socket")37__description("arg pointer to long half-uninitialized")38__success39__retval(0)40__naked void ptr_to_long_half_uninitialized(void)41{42 asm volatile (" \43 /* bpf_strtoul arg1 (buf) */ \44 r7 = r10; \45 r7 += -8; \46 r0 = 0x00303036; \47 *(u64*)(r7 + 0) = r0; \48 r1 = r7; \49 /* bpf_strtoul arg2 (buf_len) */ \50 r2 = 4; \51 /* bpf_strtoul arg3 (flags) */ \52 r3 = 0; \53 /* bpf_strtoul arg4 (res) */ \54 r7 += -8; \55 *(u32*)(r7 + 0) = r0; \56 r4 = r7; \57 /* bpf_strtoul() */ \58 call %[bpf_strtoul]; \59 r0 = 0; \60 exit; \61" :62 : __imm(bpf_strtoul)63 : __clobber_all);64}65 66SEC("cgroup/sysctl")67__description("arg pointer to long misaligned")68__failure __msg("misaligned stack access off 0+-20+0 size 8")69__naked void arg_ptr_to_long_misaligned(void)70{71 asm volatile (" \72 /* bpf_strtoul arg1 (buf) */ \73 r7 = r10; \74 r7 += -8; \75 r0 = 0x00303036; \76 *(u64*)(r7 + 0) = r0; \77 r1 = r7; \78 /* bpf_strtoul arg2 (buf_len) */ \79 r2 = 4; \80 /* bpf_strtoul arg3 (flags) */ \81 r3 = 0; \82 /* bpf_strtoul arg4 (res) */ \83 r7 += -12; \84 r0 = 0; \85 *(u32*)(r7 + 0) = r0; \86 *(u64*)(r7 + 4) = r0; \87 r4 = r7; \88 /* bpf_strtoul() */ \89 call %[bpf_strtoul]; \90 r0 = 1; \91 exit; \92" :93 : __imm(bpf_strtoul)94 : __clobber_all);95}96 97SEC("cgroup/sysctl")98__description("arg pointer to long size < sizeof(long)")99__failure __msg("invalid indirect access to stack R4 off=-4 size=8")100__naked void to_long_size_sizeof_long(void)101{102 asm volatile (" \103 /* bpf_strtoul arg1 (buf) */ \104 r7 = r10; \105 r7 += -16; \106 r0 = 0x00303036; \107 *(u64*)(r7 + 0) = r0; \108 r1 = r7; \109 /* bpf_strtoul arg2 (buf_len) */ \110 r2 = 4; \111 /* bpf_strtoul arg3 (flags) */ \112 r3 = 0; \113 /* bpf_strtoul arg4 (res) */ \114 r7 += 12; \115 *(u32*)(r7 + 0) = r0; \116 r4 = r7; \117 /* bpf_strtoul() */ \118 call %[bpf_strtoul]; \119 r0 = 1; \120 exit; \121" :122 : __imm(bpf_strtoul)123 : __clobber_all);124}125 126SEC("cgroup/sysctl")127__description("arg pointer to long initialized")128__success129__naked void arg_ptr_to_long_initialized(void)130{131 asm volatile (" \132 /* bpf_strtoul arg1 (buf) */ \133 r7 = r10; \134 r7 += -8; \135 r0 = 0x00303036; \136 *(u64*)(r7 + 0) = r0; \137 r1 = r7; \138 /* bpf_strtoul arg2 (buf_len) */ \139 r2 = 4; \140 /* bpf_strtoul arg3 (flags) */ \141 r3 = 0; \142 /* bpf_strtoul arg4 (res) */ \143 r7 += -8; \144 *(u64*)(r7 + 0) = r0; \145 r4 = r7; \146 /* bpf_strtoul() */ \147 call %[bpf_strtoul]; \148 r0 = 1; \149 exit; \150" :151 : __imm(bpf_strtoul)152 : __clobber_all);153}154 155char _license[] SEC("license") = "GPL";156