1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | /* Converted from tools/testing/selftests/bpf/verifier/uninit.c */ |
3 | |
4 | #include <linux/bpf.h> |
5 | #include <bpf/bpf_helpers.h> |
6 | #include "../../../include/linux/filter.h" |
7 | #include "bpf_misc.h" |
8 | |
9 | SEC("socket") |
10 | __description("read uninitialized register") |
11 | __failure __msg("R2 !read_ok") |
12 | __failure_unpriv |
13 | __naked void read_uninitialized_register(void) |
14 | { |
15 | asm volatile (" \ |
16 | r0 = r2; \ |
17 | exit; \ |
18 | "::: __clobber_all); |
19 | } |
20 | |
21 | SEC("socket") |
22 | __description("read invalid register") |
23 | __failure __msg("R15 is invalid") |
24 | __failure_unpriv |
25 | __naked void read_invalid_register(void) |
26 | { |
27 | asm volatile (" \ |
28 | .8byte %[mov64_reg]; \ |
29 | exit; \ |
30 | ": |
31 | : __imm_insn(mov64_reg, BPF_MOV64_REG(BPF_REG_0, -1)) |
32 | : __clobber_all); |
33 | } |
34 | |
35 | SEC("socket") |
36 | __description("program doesn't init R0 before exit") |
37 | __failure __msg("R0 !read_ok") |
38 | __failure_unpriv |
39 | __naked void t_init_r0_before_exit(void) |
40 | { |
41 | asm volatile (" \ |
42 | r2 = r1; \ |
43 | exit; \ |
44 | "::: __clobber_all); |
45 | } |
46 | |
47 | SEC("socket") |
48 | __description("program doesn't init R0 before exit in all branches") |
49 | __failure __msg("R0 !read_ok") |
50 | __msg_unpriv("R1 pointer comparison") |
51 | __naked void before_exit_in_all_branches(void) |
52 | { |
53 | asm volatile (" \ |
54 | if r1 >= 0 goto l0_%=; \ |
55 | r0 = 1; \ |
56 | r0 += 2; \ |
57 | l0_%=: exit; \ |
58 | "::: __clobber_all); |
59 | } |
60 | |
61 | char _license[] SEC("license") = "GPL"; |
62 |