1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | /* Converted from tools/testing/selftests/bpf/verifier/cfg.c */ |
3 | |
4 | #include <linux/bpf.h> |
5 | #include <bpf/bpf_helpers.h> |
6 | #include "bpf_misc.h" |
7 | |
8 | SEC("socket") |
9 | __description("unreachable") |
10 | __failure __msg("unreachable") |
11 | __failure_unpriv |
12 | __naked void unreachable(void) |
13 | { |
14 | asm volatile (" \ |
15 | exit; \ |
16 | exit; \ |
17 | "::: __clobber_all); |
18 | } |
19 | |
20 | SEC("socket") |
21 | __description("unreachable2") |
22 | __failure __msg("unreachable") |
23 | __failure_unpriv |
24 | __naked void unreachable2(void) |
25 | { |
26 | asm volatile (" \ |
27 | goto l0_%=; \ |
28 | goto l0_%=; \ |
29 | l0_%=: exit; \ |
30 | "::: __clobber_all); |
31 | } |
32 | |
33 | SEC("socket") |
34 | __description("out of range jump") |
35 | __failure __msg("jump out of range") |
36 | __failure_unpriv |
37 | __naked void out_of_range_jump(void) |
38 | { |
39 | asm volatile (" \ |
40 | goto l0_%=; \ |
41 | exit; \ |
42 | l0_%=: \ |
43 | "::: __clobber_all); |
44 | } |
45 | |
46 | SEC("socket") |
47 | __description("out of range jump2") |
48 | __failure __msg("jump out of range") |
49 | __failure_unpriv |
50 | __naked void out_of_range_jump2(void) |
51 | { |
52 | asm volatile (" \ |
53 | goto -2; \ |
54 | exit; \ |
55 | "::: __clobber_all); |
56 | } |
57 | |
58 | SEC("socket") |
59 | __description("loop (back-edge)") |
60 | __failure __msg("unreachable insn 1") |
61 | __msg_unpriv("back-edge") |
62 | __naked void loop_back_edge(void) |
63 | { |
64 | asm volatile (" \ |
65 | l0_%=: goto l0_%=; \ |
66 | exit; \ |
67 | "::: __clobber_all); |
68 | } |
69 | |
70 | SEC("socket") |
71 | __description("loop2 (back-edge)") |
72 | __failure __msg("unreachable insn 4") |
73 | __msg_unpriv("back-edge") |
74 | __naked void loop2_back_edge(void) |
75 | { |
76 | asm volatile (" \ |
77 | l0_%=: r1 = r0; \ |
78 | r2 = r0; \ |
79 | r3 = r0; \ |
80 | goto l0_%=; \ |
81 | exit; \ |
82 | "::: __clobber_all); |
83 | } |
84 | |
85 | SEC("socket") |
86 | __description("conditional loop") |
87 | __failure __msg("infinite loop detected") |
88 | __msg_unpriv("back-edge") |
89 | __naked void conditional_loop(void) |
90 | { |
91 | asm volatile (" \ |
92 | r0 = r1; \ |
93 | l0_%=: r2 = r0; \ |
94 | r3 = r0; \ |
95 | if r1 == 0 goto l0_%=; \ |
96 | exit; \ |
97 | "::: __clobber_all); |
98 | } |
99 | |
100 | SEC("socket") |
101 | __description("conditional loop (2)") |
102 | __success |
103 | __failure_unpriv __msg_unpriv("back-edge from insn 10 to 11") |
104 | __naked void conditional_loop2(void) |
105 | { |
106 | asm volatile (" \ |
107 | r9 = 2 ll; \ |
108 | r3 = 0x20 ll; \ |
109 | r4 = 0x35 ll; \ |
110 | r8 = r4; \ |
111 | goto l1_%=; \ |
112 | l0_%=: r9 -= r3; \ |
113 | r9 -= r4; \ |
114 | r9 -= r8; \ |
115 | l1_%=: r8 += r4; \ |
116 | if r8 < 0x64 goto l0_%=; \ |
117 | r0 = r9; \ |
118 | exit; \ |
119 | "::: __clobber_all); |
120 | } |
121 | |
122 | SEC("socket") |
123 | __description("unconditional loop after conditional jump") |
124 | __failure __msg("infinite loop detected") |
125 | __failure_unpriv __msg_unpriv("back-edge from insn 3 to 2") |
126 | __naked void uncond_loop_after_cond_jmp(void) |
127 | { |
128 | asm volatile (" \ |
129 | r0 = 0; \ |
130 | if r0 > 0 goto l1_%=; \ |
131 | l0_%=: r0 = 1; \ |
132 | goto l0_%=; \ |
133 | l1_%=: exit; \ |
134 | "::: __clobber_all); |
135 | } |
136 | |
137 | |
138 | __naked __noinline __used |
139 | static unsigned long never_ending_subprog() |
140 | { |
141 | asm volatile (" \ |
142 | r0 = r1; \ |
143 | goto -1; \ |
144 | "::: __clobber_all); |
145 | } |
146 | |
147 | SEC("socket") |
148 | __description("unconditional loop after conditional jump") |
149 | /* infinite loop is detected *after* check_cfg() */ |
150 | __failure __msg("infinite loop detected") |
151 | __naked void uncond_loop_in_subprog_after_cond_jmp(void) |
152 | { |
153 | asm volatile (" \ |
154 | r0 = 0; \ |
155 | if r0 > 0 goto l1_%=; \ |
156 | l0_%=: r0 += 1; \ |
157 | call never_ending_subprog; \ |
158 | l1_%=: exit; \ |
159 | "::: __clobber_all); |
160 | } |
161 | |
162 | char _license[] SEC("license") = "GPL"; |
163 |