brintos

brintos / linux-shallow public Read only

0
0
Text · 5.9 KiB · 65edc89 Raw
229 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Converted from tools/testing/selftests/bpf/verifier/ctx_sk_msg.c */3 4#include <linux/bpf.h>5#include <bpf/bpf_helpers.h>6#include "bpf_misc.h"7 8SEC("sk_msg")9__description("valid access family in SK_MSG")10__success11__naked void access_family_in_sk_msg(void)12{13	asm volatile ("					\14	r0 = *(u32*)(r1 + %[sk_msg_md_family]);		\15	exit;						\16"	:17	: __imm_const(sk_msg_md_family, offsetof(struct sk_msg_md, family))18	: __clobber_all);19}20 21SEC("sk_msg")22__description("valid access remote_ip4 in SK_MSG")23__success24__naked void remote_ip4_in_sk_msg(void)25{26	asm volatile ("					\27	r0 = *(u32*)(r1 + %[sk_msg_md_remote_ip4]);	\28	exit;						\29"	:30	: __imm_const(sk_msg_md_remote_ip4, offsetof(struct sk_msg_md, remote_ip4))31	: __clobber_all);32}33 34SEC("sk_msg")35__description("valid access local_ip4 in SK_MSG")36__success37__naked void local_ip4_in_sk_msg(void)38{39	asm volatile ("					\40	r0 = *(u32*)(r1 + %[sk_msg_md_local_ip4]);	\41	exit;						\42"	:43	: __imm_const(sk_msg_md_local_ip4, offsetof(struct sk_msg_md, local_ip4))44	: __clobber_all);45}46 47SEC("sk_msg")48__description("valid access remote_port in SK_MSG")49__success50__naked void remote_port_in_sk_msg(void)51{52	asm volatile ("					\53	r0 = *(u32*)(r1 + %[sk_msg_md_remote_port]);	\54	exit;						\55"	:56	: __imm_const(sk_msg_md_remote_port, offsetof(struct sk_msg_md, remote_port))57	: __clobber_all);58}59 60SEC("sk_msg")61__description("valid access local_port in SK_MSG")62__success63__naked void local_port_in_sk_msg(void)64{65	asm volatile ("					\66	r0 = *(u32*)(r1 + %[sk_msg_md_local_port]);	\67	exit;						\68"	:69	: __imm_const(sk_msg_md_local_port, offsetof(struct sk_msg_md, local_port))70	: __clobber_all);71}72 73SEC("sk_skb")74__description("valid access remote_ip6 in SK_MSG")75__success76__naked void remote_ip6_in_sk_msg(void)77{78	asm volatile ("					\79	r0 = *(u32*)(r1 + %[sk_msg_md_remote_ip6_0]);	\80	r0 = *(u32*)(r1 + %[sk_msg_md_remote_ip6_1]);	\81	r0 = *(u32*)(r1 + %[sk_msg_md_remote_ip6_2]);	\82	r0 = *(u32*)(r1 + %[sk_msg_md_remote_ip6_3]);	\83	exit;						\84"	:85	: __imm_const(sk_msg_md_remote_ip6_0, offsetof(struct sk_msg_md, remote_ip6[0])),86	  __imm_const(sk_msg_md_remote_ip6_1, offsetof(struct sk_msg_md, remote_ip6[1])),87	  __imm_const(sk_msg_md_remote_ip6_2, offsetof(struct sk_msg_md, remote_ip6[2])),88	  __imm_const(sk_msg_md_remote_ip6_3, offsetof(struct sk_msg_md, remote_ip6[3]))89	: __clobber_all);90}91 92SEC("sk_skb")93__description("valid access local_ip6 in SK_MSG")94__success95__naked void local_ip6_in_sk_msg(void)96{97	asm volatile ("					\98	r0 = *(u32*)(r1 + %[sk_msg_md_local_ip6_0]);	\99	r0 = *(u32*)(r1 + %[sk_msg_md_local_ip6_1]);	\100	r0 = *(u32*)(r1 + %[sk_msg_md_local_ip6_2]);	\101	r0 = *(u32*)(r1 + %[sk_msg_md_local_ip6_3]);	\102	exit;						\103"	:104	: __imm_const(sk_msg_md_local_ip6_0, offsetof(struct sk_msg_md, local_ip6[0])),105	  __imm_const(sk_msg_md_local_ip6_1, offsetof(struct sk_msg_md, local_ip6[1])),106	  __imm_const(sk_msg_md_local_ip6_2, offsetof(struct sk_msg_md, local_ip6[2])),107	  __imm_const(sk_msg_md_local_ip6_3, offsetof(struct sk_msg_md, local_ip6[3]))108	: __clobber_all);109}110 111SEC("sk_msg")112__description("valid access size in SK_MSG")113__success114__naked void access_size_in_sk_msg(void)115{116	asm volatile ("					\117	r0 = *(u32*)(r1 + %[sk_msg_md_size]);		\118	exit;						\119"	:120	: __imm_const(sk_msg_md_size, offsetof(struct sk_msg_md, size))121	: __clobber_all);122}123 124SEC("sk_msg")125__description("invalid 64B read of size in SK_MSG")126__failure __msg("invalid bpf_context access")127__flag(BPF_F_ANY_ALIGNMENT)128__naked void of_size_in_sk_msg(void)129{130	asm volatile ("					\131	r2 = *(u64*)(r1 + %[sk_msg_md_size]);		\132	exit;						\133"	:134	: __imm_const(sk_msg_md_size, offsetof(struct sk_msg_md, size))135	: __clobber_all);136}137 138SEC("sk_msg")139__description("invalid read past end of SK_MSG")140__failure __msg("invalid bpf_context access")141__naked void past_end_of_sk_msg(void)142{143	asm volatile ("					\144	r2 = *(u32*)(r1 + %[__imm_0]);			\145	exit;						\146"	:147	: __imm_const(__imm_0, offsetof(struct sk_msg_md, size) + 4)148	: __clobber_all);149}150 151SEC("sk_msg")152__description("invalid read offset in SK_MSG")153__failure __msg("invalid bpf_context access")154__flag(BPF_F_ANY_ALIGNMENT)155__naked void read_offset_in_sk_msg(void)156{157	asm volatile ("					\158	r2 = *(u32*)(r1 + %[__imm_0]);			\159	exit;						\160"	:161	: __imm_const(__imm_0, offsetof(struct sk_msg_md, family) + 1)162	: __clobber_all);163}164 165SEC("sk_msg")166__description("direct packet read for SK_MSG")167__success168__naked void packet_read_for_sk_msg(void)169{170	asm volatile ("					\171	r2 = *(u64*)(r1 + %[sk_msg_md_data]);		\172	r3 = *(u64*)(r1 + %[sk_msg_md_data_end]);	\173	r0 = r2;					\174	r0 += 8;					\175	if r0 > r3 goto l0_%=;				\176	r0 = *(u8*)(r2 + 0);				\177l0_%=:	r0 = 0;						\178	exit;						\179"	:180	: __imm_const(sk_msg_md_data, offsetof(struct sk_msg_md, data)),181	  __imm_const(sk_msg_md_data_end, offsetof(struct sk_msg_md, data_end))182	: __clobber_all);183}184 185SEC("sk_msg")186__description("direct packet write for SK_MSG")187__success188__naked void packet_write_for_sk_msg(void)189{190	asm volatile ("					\191	r2 = *(u64*)(r1 + %[sk_msg_md_data]);		\192	r3 = *(u64*)(r1 + %[sk_msg_md_data_end]);	\193	r0 = r2;					\194	r0 += 8;					\195	if r0 > r3 goto l0_%=;				\196	*(u8*)(r2 + 0) = r2;				\197l0_%=:	r0 = 0;						\198	exit;						\199"	:200	: __imm_const(sk_msg_md_data, offsetof(struct sk_msg_md, data)),201	  __imm_const(sk_msg_md_data_end, offsetof(struct sk_msg_md, data_end))202	: __clobber_all);203}204 205SEC("sk_msg")206__description("overlapping checks for direct packet access SK_MSG")207__success208__naked void direct_packet_access_sk_msg(void)209{210	asm volatile ("					\211	r2 = *(u64*)(r1 + %[sk_msg_md_data]);		\212	r3 = *(u64*)(r1 + %[sk_msg_md_data_end]);	\213	r0 = r2;					\214	r0 += 8;					\215	if r0 > r3 goto l0_%=;				\216	r1 = r2;					\217	r1 += 6;					\218	if r1 > r3 goto l0_%=;				\219	r0 = *(u16*)(r2 + 6);				\220l0_%=:	r0 = 0;						\221	exit;						\222"	:223	: __imm_const(sk_msg_md_data, offsetof(struct sk_msg_md, data)),224	  __imm_const(sk_msg_md_data_end, offsetof(struct sk_msg_md, data_end))225	: __clobber_all);226}227 228char _license[] SEC("license") = "GPL";229