diff options
Diffstat (limited to 'tools/testing/selftests/bpf/progs/verifier_uninit.c')
| -rw-r--r-- | tools/testing/selftests/bpf/progs/verifier_uninit.c | 61 | 
1 files changed, 61 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/progs/verifier_uninit.c b/tools/testing/selftests/bpf/progs/verifier_uninit.c new file mode 100644 index 000000000000..7718cd7d19ce --- /dev/null +++ b/tools/testing/selftests/bpf/progs/verifier_uninit.c @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Converted from tools/testing/selftests/bpf/verifier/uninit.c */ + +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> +#include "../../../include/linux/filter.h" +#include "bpf_misc.h" + +SEC("socket") +__description("read uninitialized register") +__failure __msg("R2 !read_ok") +__failure_unpriv +__naked void read_uninitialized_register(void) +{ +	asm volatile ("					\ +	r0 = r2;					\ +	exit;						\ +"	::: __clobber_all); +} + +SEC("socket") +__description("read invalid register") +__failure __msg("R15 is invalid") +__failure_unpriv +__naked void read_invalid_register(void) +{ +	asm volatile ("					\ +	.8byte %[mov64_reg];				\ +	exit;						\ +"	: +	: __imm_insn(mov64_reg, BPF_MOV64_REG(BPF_REG_0, -1)) +	: __clobber_all); +} + +SEC("socket") +__description("program doesn't init R0 before exit") +__failure __msg("R0 !read_ok") +__failure_unpriv +__naked void t_init_r0_before_exit(void) +{ +	asm volatile ("					\ +	r2 = r1;					\ +	exit;						\ +"	::: __clobber_all); +} + +SEC("socket") +__description("program doesn't init R0 before exit in all branches") +__failure __msg("R0 !read_ok") +__msg_unpriv("R1 pointer comparison") +__naked void before_exit_in_all_branches(void) +{ +	asm volatile ("					\ +	if r1 >= 0 goto l0_%=;				\ +	r0 = 1;						\ +	r0 += 2;					\ +l0_%=:	exit;						\ +"	::: __clobber_all); +} + +char _license[] SEC("license") = "GPL";  |