Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/tools/testing/selftests/bpf/progs/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 11 kB image not shown  

Quelle  verifier_stack_ptr.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/* Converted from tools/testing/selftests/bpf/verifier/stack_ptr.c */

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <limits.h>
#include "bpf_misc.h"

#define MAX_ENTRIES 11

struct test_val {
 unsigned int index;
 int foo[MAX_ENTRIES];
};

struct {
 __uint(type, BPF_MAP_TYPE_ARRAY);
 __uint(max_entries, 1);
 __type(key, int);
 __type(value, struct test_val);
} map_array_48b SEC(".maps");

SEC("socket")
__description("PTR_TO_STACK store/load")
__success __success_unpriv __retval(0xfaceb00c)
__naked void ptr_to_stack_store_load(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -10;     \
 r0 = 0xfaceb00c;    \
 *(u64*)(r1 + 2) = r0;    \
 r0 = *(u64*)(r1 + 2);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK store/load - bad alignment on off")
__failure __msg("misaligned stack access off 0+-8+2 size 8")
__failure_unpriv
__naked void load_bad_alignment_on_off(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -8;     \
 r0 = 0xfaceb00c;    \
 *(u64*)(r1 + 2) = r0;    \
 r0 = *(u64*)(r1 + 2);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK store/load - bad alignment on reg")
__failure __msg("misaligned stack access off 0+-10+8 size 8")
__failure_unpriv
__naked void load_bad_alignment_on_reg(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -10;     \
 r0 = 0xfaceb00c;    \
 *(u64*)(r1 + 8) = r0;    \
 r0 = *(u64*)(r1 + 8);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK store/load - out of bounds low")
__failure __msg("invalid write to stack R1 off=-79992 size=8")
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__naked void load_out_of_bounds_low(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -80000;     \
 r0 = 0xfaceb00c;    \
 *(u64*)(r1 + 8) = r0;    \
 r0 = *(u64*)(r1 + 8);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK store/load - out of bounds high")
__failure __msg("invalid write to stack R1 off=0 size=8")
__failure_unpriv
__naked void load_out_of_bounds_high(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -8;     \
 r0 = 0xfaceb00c;    \
 *(u64*)(r1 + 8) = r0;    \
 r0 = *(u64*)(r1 + 8);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check high 1")
__success __success_unpriv __retval(42)
__naked void to_stack_check_high_1(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -1;     \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = *(u8*)(r1 + 0);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check high 2")
__success __success_unpriv __retval(42)
__naked void to_stack_check_high_2(void)
{
 asm volatile (" \
 r1 = r10;     \
 r0 = 42;     \
 *(u8*)(r1 - 1) = r0;    \
 r0 = *(u8*)(r1 - 1);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check high 3")
__success __failure_unpriv
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__retval(42)
__naked void to_stack_check_high_3(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += 0;     \
 r0 = 42;     \
 *(u8*)(r1 - 1) = r0;    \
 r0 = *(u8*)(r1 - 1);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check high 4")
__failure __msg("invalid write to stack R1 off=0 size=1")
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__naked void to_stack_check_high_4(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += 0;     \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = *(u8*)(r1 + 0);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check high 5")
__failure __msg("invalid write to stack R1")
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__naked void to_stack_check_high_5(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += %[__imm_0];    \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = *(u8*)(r1 + 0);    \
 exit;      \
" :
 : __imm_const(__imm_0, (1 << 29) - 1)
 : __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check high 6")
__failure __msg("invalid write to stack")
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__naked void to_stack_check_high_6(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += %[__imm_0];    \
 r0 = 42;     \
 *(u8*)(r1 + %[shrt_max]) = r0;   \
 r0 = *(u8*)(r1 + %[shrt_max]);   \
 exit;      \
" :
 : __imm_const(__imm_0, (1 << 29) - 1),
   __imm_const(shrt_max, SHRT_MAX)
 : __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check high 7")
__failure __msg("fp pointer offset")
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__naked void to_stack_check_high_7(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += %[__imm_0];    \
 r1 += %[__imm_0];    \
 r0 = 42;     \
 *(u8*)(r1 + %[shrt_max]) = r0;   \
 r0 = *(u8*)(r1 + %[shrt_max]);   \
 exit;      \
" :
 : __imm_const(__imm_0, (1 << 29) - 1),
   __imm_const(shrt_max, SHRT_MAX)
 : __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check low 1")
__success __success_unpriv __retval(42)
__naked void to_stack_check_low_1(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -512;     \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = *(u8*)(r1 + 0);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check low 2")
__success __failure_unpriv
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__retval(42)
__naked void to_stack_check_low_2(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -513;     \
 r0 = 42;     \
 *(u8*)(r1 + 1) = r0;    \
 r0 = *(u8*)(r1 + 1);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check low 3")
__failure __msg("invalid write to stack R1 off=-513 size=1")
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__naked void to_stack_check_low_3(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -513;     \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = *(u8*)(r1 + 0);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check low 4")
__failure __msg("math between fp pointer")
__failure_unpriv
__naked void to_stack_check_low_4(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += %[int_min];    \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = *(u8*)(r1 + 0);    \
 exit;      \
" :
 : __imm_const(int_min, INT_MIN)
 : __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check low 5")
__failure __msg("invalid write to stack")
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__naked void to_stack_check_low_5(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += %[__imm_0];    \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = *(u8*)(r1 + 0);    \
 exit;      \
" :
 : __imm_const(__imm_0, -((1 << 29) - 1))
 : __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check low 6")
__failure __msg("invalid write to stack")
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__naked void to_stack_check_low_6(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += %[__imm_0];    \
 r0 = 42;     \
 *(u8*)(r1  %[shrt_min]) = r0;   \
 r0 = *(u8*)(r1  %[shrt_min]);   \
 exit;      \
" :
 : __imm_const(__imm_0, -((1 << 29) - 1)),
   __imm_const(shrt_min, SHRT_MIN)
 : __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK check low 7")
__failure __msg("fp pointer offset")
__msg_unpriv("R1 stack pointer arithmetic goes out of range")
__naked void to_stack_check_low_7(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += %[__imm_0];    \
 r1 += %[__imm_0];    \
 r0 = 42;     \
 *(u8*)(r1  %[shrt_min]) = r0;   \
 r0 = *(u8*)(r1  %[shrt_min]);   \
 exit;      \
" :
 : __imm_const(__imm_0, -((1 << 29) - 1)),
   __imm_const(shrt_min, SHRT_MIN)
 : __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK mixed reg/k, 1")
__success __success_unpriv __retval(42)
__naked void stack_mixed_reg_k_1(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -3;     \
 r2 = -3;     \
 r1 += r2;     \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = *(u8*)(r1 + 0);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK mixed reg/k, 2")
__success __success_unpriv __retval(42)
__naked void stack_mixed_reg_k_2(void)
{
 asm volatile (" \
 r0 = 0;      \
 *(u64*)(r10 - 8) = r0;    \
 r0 = 0;      \
 *(u64*)(r10 - 16) = r0;    \
 r1 = r10;     \
 r1 += -3;     \
 r2 = -3;     \
 r1 += r2;     \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r5 = r10;     \
 r0 = *(u8*)(r5 - 6);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK mixed reg/k, 3")
__success __success_unpriv __retval(-3)
__naked void stack_mixed_reg_k_3(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -3;     \
 r2 = -3;     \
 r1 += r2;     \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = r2;     \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK reg")
__success __success_unpriv __retval(42)
__naked void ptr_to_stack_reg(void)
{
 asm volatile (" \
 r1 = r10;     \
 r2 = -3;     \
 r1 += r2;     \
 r0 = 42;     \
 *(u8*)(r1 + 0) = r0;    \
 r0 = *(u8*)(r1 + 0);    \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("stack pointer arithmetic")
__success __success_unpriv __retval(0)
__naked void stack_pointer_arithmetic(void)
{
 asm volatile (" \
 r1 = 4;      \
 goto l0_%=;     \
l0_%=: r7 = r10;     \
 r7 += -10;     \
 r7 += -10;     \
 r2 = r7;     \
 r2 += r1;     \
 r0 = 0;      \
 *(u32*)(r2 + 4) = r0;    \
 r2 = r7;     \
 r2 += 8;     \
 r0 = 0;      \
 *(u32*)(r2 + 4) = r0;    \
 r0 = 0;      \
 exit;      \
" ::: __clobber_all);
}

SEC("tc")
__description("store PTR_TO_STACK in R10 to array map using BPF_B")
__success __retval(42)
__naked void array_map_using_bpf_b(void)
{
 asm volatile (" \
 /* Load pointer to map. */ \
 r2 = r10;     \
 r2 += -8;     \
 r1 = 0;      \
 *(u64*)(r2 + 0) = r1;    \
 r1 = %[map_array_48b] ll;   \
 call %[bpf_map_lookup_elem];   \
 if r0 != 0 goto l0_%=;    \
 r0 = 2;      \
 exit;      \
l0_%=: r1 = r0;     \
 /* Copy R10 to R9. */ \
 r9 = r10;     \
 /* Pollute other registers with unaligned values. */\
 r2 = -1;     \
 r3 = -1;     \
 r4 = -1;     \
 r5 = -1;     \
 r6 = -1;     \
 r7 = -1;     \
 r8 = -1;     \
 /* Store both R9 and R10 with BPF_B and read back. */\
 *(u8*)(r1 + 0) = r10;    \
 r2 = *(u8*)(r1 + 0);    \
 *(u8*)(r1 + 0) = r9;    \
 r3 = *(u8*)(r1 + 0);    \
 /* Should read back as same value. */ \
 if r2 == r3 goto l1_%=;    \
 r0 = 1;      \
 exit;      \
l1_%=: r0 = 42;     \
 exit;      \
" :
 : __imm(bpf_map_lookup_elem),
   __imm_addr(map_array_48b)
 : __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK stack size > 512")
__failure __msg("invalid write to stack R1 off=-520 size=8")
__naked void stack_check_size_gt_512(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -520;     \
 r0 = 42;     \
 *(u64*)(r1 + 0) = r0;    \
 exit;      \
" ::: __clobber_all);
}

#ifdef __BPF_FEATURE_MAY_GOTO
SEC("socket")
__description("PTR_TO_STACK stack size 512 with may_goto with jit")
__load_if_JITed()
__success __retval(42)
__naked void stack_check_size_512_with_may_goto_jit(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -512;     \
 r0 = 42;     \
 *(u32*)(r1 + 0) = r0;    \
 may_goto l0_%=;     \
 r2 = 100;     \
 l0_%=:      \
 exit;      \
" ::: __clobber_all);
}

SEC("socket")
__description("PTR_TO_STACK stack size 512 with may_goto without jit")
__load_if_no_JITed()
__failure __msg("stack size 520(extra 8) is too large")
__naked void stack_check_size_512_with_may_goto(void)
{
 asm volatile (" \
 r1 = r10;     \
 r1 += -512;     \
 r0 = 42;     \
 *(u32*)(r1 + 0) = r0;    \
 may_goto l0_%=;     \
 r2 = 100;     \
 l0_%=:      \
 exit;      \
" ::: __clobber_all);
}
#endif

char _license[] SEC("license") = "GPL";

Messung V0.5
C=99 H=60 G=81

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.