Skip to content

Commit 1e0a836

Browse files
jrifeAlexei Starovoitov
authored andcommitted
selftests/bpf: Expand sockaddr program return value tests
This patch expands verifier coverage for program return values to cover bind, connect, sendmsg, getsockname, and getpeername hooks. It also rounds out the recvmsg coverage by adding test cases for recvmsg_unix hooks. Signed-off-by: Jordan Rife <jrife@google.com> Link: https://lore.kernel.org/r/20240510190246.3247730-15-jrife@google.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent 61ecfdf commit 1e0a836

1 file changed

Lines changed: 294 additions & 0 deletions

File tree

tools/testing/selftests/bpf/progs/verifier_sock_addr.c

Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,298 @@ int recvmsg6_bad_return_code(struct bpf_sock_addr *ctx)
3434
return 0;
3535
}
3636

37+
SEC("cgroup/recvmsg_unix")
38+
__success
39+
int recvmsg_unix_good_return_code(struct bpf_sock_addr *ctx)
40+
{
41+
return 1;
42+
}
43+
44+
SEC("cgroup/recvmsg_unix")
45+
__failure __msg("At program exit the register R0 has smin=0 smax=0 should have been in [1, 1]")
46+
int recvmsg_unix_bad_return_code(struct bpf_sock_addr *ctx)
47+
{
48+
return 0;
49+
}
50+
51+
SEC("cgroup/sendmsg4")
52+
__success
53+
int sendmsg4_good_return_code_0(struct bpf_sock_addr *ctx)
54+
{
55+
return 0;
56+
}
57+
58+
SEC("cgroup/sendmsg4")
59+
__success
60+
int sendmsg4_good_return_code_1(struct bpf_sock_addr *ctx)
61+
{
62+
return 1;
63+
}
64+
65+
SEC("cgroup/sendmsg4")
66+
__failure __msg("At program exit the register R0 has smin=2 smax=2 should have been in [0, 1]")
67+
int sendmsg4_bad_return_code(struct bpf_sock_addr *ctx)
68+
{
69+
return 2;
70+
}
71+
72+
SEC("cgroup/sendmsg6")
73+
__success
74+
int sendmsg6_good_return_code_0(struct bpf_sock_addr *ctx)
75+
{
76+
return 0;
77+
}
78+
79+
SEC("cgroup/sendmsg6")
80+
__success
81+
int sendmsg6_good_return_code_1(struct bpf_sock_addr *ctx)
82+
{
83+
return 1;
84+
}
85+
86+
SEC("cgroup/sendmsg6")
87+
__failure __msg("At program exit the register R0 has smin=2 smax=2 should have been in [0, 1]")
88+
int sendmsg6_bad_return_code(struct bpf_sock_addr *ctx)
89+
{
90+
return 2;
91+
}
92+
93+
SEC("cgroup/sendmsg_unix")
94+
__success
95+
int sendmsg_unix_good_return_code_0(struct bpf_sock_addr *ctx)
96+
{
97+
return 0;
98+
}
99+
100+
SEC("cgroup/sendmsg_unix")
101+
__success
102+
int sendmsg_unix_good_return_code_1(struct bpf_sock_addr *ctx)
103+
{
104+
return 1;
105+
}
106+
107+
SEC("cgroup/sendmsg_unix")
108+
__failure __msg("At program exit the register R0 has smin=2 smax=2 should have been in [0, 1]")
109+
int sendmsg_unix_bad_return_code(struct bpf_sock_addr *ctx)
110+
{
111+
return 2;
112+
}
113+
114+
SEC("cgroup/getpeername4")
115+
__success
116+
int getpeername4_good_return_code(struct bpf_sock_addr *ctx)
117+
{
118+
return 1;
119+
}
120+
121+
SEC("cgroup/getpeername4")
122+
__failure __msg("At program exit the register R0 has smin=0 smax=0 should have been in [1, 1]")
123+
int getpeername4_bad_return_code(struct bpf_sock_addr *ctx)
124+
{
125+
return 0;
126+
}
127+
128+
SEC("cgroup/getpeername6")
129+
__success
130+
int getpeername6_good_return_code(struct bpf_sock_addr *ctx)
131+
{
132+
return 1;
133+
}
134+
135+
SEC("cgroup/getpeername6")
136+
__failure __msg("At program exit the register R0 has smin=0 smax=0 should have been in [1, 1]")
137+
int getpeername6_bad_return_code(struct bpf_sock_addr *ctx)
138+
{
139+
return 0;
140+
}
141+
142+
SEC("cgroup/getpeername_unix")
143+
__success
144+
int getpeername_unix_good_return_code(struct bpf_sock_addr *ctx)
145+
{
146+
return 1;
147+
}
148+
149+
SEC("cgroup/getpeername_unix")
150+
__failure __msg("At program exit the register R0 has smin=0 smax=0 should have been in [1, 1]")
151+
int getpeername_unix_bad_return_code(struct bpf_sock_addr *ctx)
152+
{
153+
return 0;
154+
}
155+
156+
SEC("cgroup/getsockname4")
157+
__success
158+
int getsockname4_good_return_code(struct bpf_sock_addr *ctx)
159+
{
160+
return 1;
161+
}
162+
163+
SEC("cgroup/getsockname4")
164+
__failure __msg("At program exit the register R0 has smin=0 smax=0 should have been in [1, 1]")
165+
int getsockname4_bad_return_code(struct bpf_sock_addr *ctx)
166+
{
167+
return 0;
168+
}
169+
170+
SEC("cgroup/getsockname6")
171+
__success
172+
int getsockname6_good_return_code(struct bpf_sock_addr *ctx)
173+
{
174+
return 1;
175+
}
176+
177+
SEC("cgroup/getsockname6")
178+
__failure __msg("At program exit the register R0 has smin=0 smax=0 should have been in [1, 1]")
179+
int getsockname6_bad_return_code(struct bpf_sock_addr *ctx)
180+
{
181+
return 0;
182+
}
183+
184+
SEC("cgroup/getsockname_unix")
185+
__success
186+
int getsockname_unix_good_return_code(struct bpf_sock_addr *ctx)
187+
{
188+
return 1;
189+
}
190+
191+
SEC("cgroup/getsockname_unix")
192+
__failure __msg("At program exit the register R0 has smin=0 smax=0 should have been in [1, 1]")
193+
int getsockname_unix_unix_bad_return_code(struct bpf_sock_addr *ctx)
194+
{
195+
return 0;
196+
}
197+
198+
SEC("cgroup/bind4")
199+
__success
200+
int bind4_good_return_code_0(struct bpf_sock_addr *ctx)
201+
{
202+
return 0;
203+
}
204+
205+
SEC("cgroup/bind4")
206+
__success
207+
int bind4_good_return_code_1(struct bpf_sock_addr *ctx)
208+
{
209+
return 1;
210+
}
211+
212+
SEC("cgroup/bind4")
213+
__success
214+
int bind4_good_return_code_2(struct bpf_sock_addr *ctx)
215+
{
216+
return 2;
217+
}
218+
219+
SEC("cgroup/bind4")
220+
__success
221+
int bind4_good_return_code_3(struct bpf_sock_addr *ctx)
222+
{
223+
return 3;
224+
}
225+
226+
SEC("cgroup/bind4")
227+
__failure __msg("At program exit the register R0 has smin=4 smax=4 should have been in [0, 3]")
228+
int bind4_bad_return_code(struct bpf_sock_addr *ctx)
229+
{
230+
return 4;
231+
}
232+
233+
SEC("cgroup/bind6")
234+
__success
235+
int bind6_good_return_code_0(struct bpf_sock_addr *ctx)
236+
{
237+
return 0;
238+
}
239+
240+
SEC("cgroup/bind6")
241+
__success
242+
int bind6_good_return_code_1(struct bpf_sock_addr *ctx)
243+
{
244+
return 1;
245+
}
246+
247+
SEC("cgroup/bind6")
248+
__success
249+
int bind6_good_return_code_2(struct bpf_sock_addr *ctx)
250+
{
251+
return 2;
252+
}
253+
254+
SEC("cgroup/bind6")
255+
__success
256+
int bind6_good_return_code_3(struct bpf_sock_addr *ctx)
257+
{
258+
return 3;
259+
}
260+
261+
SEC("cgroup/bind6")
262+
__failure __msg("At program exit the register R0 has smin=4 smax=4 should have been in [0, 3]")
263+
int bind6_bad_return_code(struct bpf_sock_addr *ctx)
264+
{
265+
return 4;
266+
}
267+
268+
SEC("cgroup/connect4")
269+
__success
270+
int connect4_good_return_code_0(struct bpf_sock_addr *ctx)
271+
{
272+
return 0;
273+
}
274+
275+
SEC("cgroup/connect4")
276+
__success
277+
int connect4_good_return_code_1(struct bpf_sock_addr *ctx)
278+
{
279+
return 1;
280+
}
281+
282+
SEC("cgroup/connect4")
283+
__failure __msg("At program exit the register R0 has smin=2 smax=2 should have been in [0, 1]")
284+
int connect4_bad_return_code(struct bpf_sock_addr *ctx)
285+
{
286+
return 2;
287+
}
288+
289+
SEC("cgroup/connect6")
290+
__success
291+
int connect6_good_return_code_0(struct bpf_sock_addr *ctx)
292+
{
293+
return 0;
294+
}
295+
296+
SEC("cgroup/connect6")
297+
__success
298+
int connect6_good_return_code_1(struct bpf_sock_addr *ctx)
299+
{
300+
return 1;
301+
}
302+
303+
SEC("cgroup/connect6")
304+
__failure __msg("At program exit the register R0 has smin=2 smax=2 should have been in [0, 1]")
305+
int connect6_bad_return_code(struct bpf_sock_addr *ctx)
306+
{
307+
return 2;
308+
}
309+
310+
SEC("cgroup/connect_unix")
311+
__success
312+
int connect_unix_good_return_code_0(struct bpf_sock_addr *ctx)
313+
{
314+
return 0;
315+
}
316+
317+
SEC("cgroup/connect_unix")
318+
__success
319+
int connect_unix_good_return_code_1(struct bpf_sock_addr *ctx)
320+
{
321+
return 1;
322+
}
323+
324+
SEC("cgroup/connect_unix")
325+
__failure __msg("At program exit the register R0 has smin=2 smax=2 should have been in [0, 1]")
326+
int connect_unix_bad_return_code(struct bpf_sock_addr *ctx)
327+
{
328+
return 2;
329+
}
330+
37331
char _license[] SEC("license") = "GPL";

0 commit comments

Comments
 (0)