1162271Srwatson/*-
2162271Srwatson * Copyright (c) 2006 nCircle Network Security, Inc.
3172106Srwatson * Copyright (c) 2007 Robert N. M. Watson
4162271Srwatson * All rights reserved.
5162271Srwatson *
6162271Srwatson * This software was developed by Robert N. M. Watson for the TrustedBSD
7162271Srwatson * Project under contract to nCircle Network Security, Inc.
8162271Srwatson *
9162271Srwatson * Redistribution and use in source and binary forms, with or without
10162271Srwatson * modification, are permitted provided that the following conditions
11162271Srwatson * are met:
12162271Srwatson * 1. Redistributions of source code must retain the above copyright
13162271Srwatson *    notice, this list of conditions and the following disclaimer.
14162271Srwatson * 2. Redistributions in binary form must reproduce the above copyright
15162271Srwatson *    notice, this list of conditions and the following disclaimer in the
16162271Srwatson *    documentation and/or other materials provided with the distribution.
17162271Srwatson *
18162271Srwatson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19162271Srwatson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20162271Srwatson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21162271Srwatson * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR, NCIRCLE NETWORK SECURITY,
22162271Srwatson * INC., OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23162271Srwatson * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24162271Srwatson * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25162271Srwatson * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26162271Srwatson * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27162271Srwatson * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28162271Srwatson * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29162271Srwatson *
30162271Srwatson * $FreeBSD$
31162271Srwatson */
32162271Srwatson
33162271Srwatson#define	UID_ROOT	0
34162271Srwatson#define	UID_OWNER	100
35162271Srwatson#define	UID_OTHER	200
36162271Srwatson#define	UID_THIRD	300
37162271Srwatson
38162271Srwatson#define	GID_WHEEL	0
39162271Srwatson#define	GID_OWNER	100
40162271Srwatson#define	GID_OTHER	200
41162271Srwatson
42162271Srwatson#define	KENV_VAR_NAME	"test"
43162271Srwatson#define	KENV_VAR_VALUE	"test"
44172106Srwatson#define	KENV_VAR_LEN	sizeof(KENV_VAR_VALUE)
45162271Srwatson
46162271Srwatson/*
47162271Srwatson * Library routines used by many tests.
48162271Srwatson */
49172106Srwatsonvoid	setup_dir(const char *test, char *dpathp, uid_t uid, gid_t gid,
50172106Srwatson	    mode_t mode);
51172106Srwatsonvoid	setup_file(const char *test, char *fpathp, uid_t uid, gid_t gid,
52172106Srwatson	    mode_t mode);
53172106Srwatsonvoid	expect(const char *test, int error, int expected_error,
54172106Srwatson	    int expected_errno);
55162271Srwatson
56162271Srwatson/*
57172106Srwatson * Definition for a particular test, both used to manage the test list in
58172106Srwatson * main.c, and passed to tests so they can be aware of which specific test is
59172106Srwatson * running if particular method implementations are shared across tests.
60162271Srwatson */
61172106Srwatsonstruct test {
62172106Srwatson	const char	*t_name;
63172106Srwatson	int		(*t_setup_func)(int asroot, int injail,
64172106Srwatson			    struct test *test);
65172106Srwatson	void		(*t_test_func)(int asroot, int injail,
66172106Srwatson			    struct test *test);
67172106Srwatson	void		(*t_cleanup_func)(int asroot, int injail,
68172106Srwatson			    struct test *test);
69172106Srwatson};
70162271Srwatson
71162271Srwatson/*
72172106Srwatson * Prototypes for test functions that will be hooked up to the test vector in
73172106Srwatson * main.c.  It's possible to imagine more dynamic (convenient?) ways to do
74172106Srwatson * this.
75162271Srwatson */
76172106Srwatsonint	priv_acct_setup(int, int, struct test *);
77172106Srwatsonvoid	priv_acct_enable(int, int, struct test *);
78172106Srwatsonvoid	priv_acct_disable(int, int, struct test *);
79172106Srwatsonvoid	priv_acct_rotate(int, int, struct test *);
80172106Srwatsonvoid	priv_acct_noopdisable(int, int, struct test *);
81172106Srwatsonvoid	priv_acct_cleanup(int, int, struct test *);
82172106Srwatson
83172106Srwatsonint	priv_adjtime_setup(int, int, struct test *);
84172106Srwatsonvoid	priv_adjtime_set(int, int, struct test *);
85172106Srwatsonvoid	priv_adjtime_cleanup(int, int, struct test *);
86172106Srwatson
87172106Srwatsonint	priv_audit_submit_setup(int, int, struct test *);
88172106Srwatsonvoid	priv_audit_submit(int, int, struct test *);
89172106Srwatsonvoid	priv_audit_submit_cleanup(int, int, struct test *);
90172106Srwatson
91172106Srwatsonint	priv_audit_control_setup(int, int, struct test *);
92172106Srwatsonvoid	priv_audit_control(int, int, struct test *);
93172106Srwatsonvoid	priv_audit_control_cleanup(int, int, struct test *);
94172106Srwatson
95172106Srwatsonint	priv_audit_getaudit_setup(int, int, struct test *);
96172106Srwatsonvoid	priv_audit_getaudit(int, int, struct test *);
97172106Srwatsonvoid	priv_audit_getaudit_addr(int, int, struct test *);
98172106Srwatsonvoid	priv_audit_getaudit_cleanup(int, int, struct test *);
99172106Srwatson
100172106Srwatsonint	priv_audit_setaudit_setup(int, int, struct test *);
101172106Srwatsonvoid	priv_audit_setaudit(int, int, struct test *);
102172106Srwatsonvoid	priv_audit_setaudit_addr(int, int, struct test *);
103172106Srwatsonvoid	priv_audit_setaudit_cleanup(int, int, struct test *);
104172106Srwatson
105172106Srwatsonint	priv_clock_settime_setup(int, int, struct test *);
106172106Srwatsonvoid	priv_clock_settime(int, int, struct test *);
107172106Srwatsonvoid	priv_clock_settime_cleanup(int, int, struct test *);
108172106Srwatson
109172106Srwatsonint	priv_cred_setup(int, int, struct test *);
110172106Srwatsonvoid	priv_cred_setuid(int, int, struct test *);
111172106Srwatsonvoid	priv_cred_seteuid(int, int, struct test *);
112172106Srwatsonvoid	priv_cred_setgid(int, int, struct test *);
113172106Srwatsonvoid	priv_cred_setegid(int, int, struct test *);
114172106Srwatsonvoid	priv_cred_setgroups(int, int, struct test *);
115172106Srwatsonvoid	priv_cred_setreuid(int, int, struct test *);
116172106Srwatsonvoid	priv_cred_setregid(int, int, struct test *);
117172106Srwatsonvoid	priv_cred_setresuid(int, int, struct test *);
118172106Srwatsonvoid	priv_cred_setresgid(int, int, struct test *);
119172106Srwatsonvoid	priv_cred_cleanup(int, int, struct test *);
120172106Srwatson
121172106Srwatsonint	priv_io_setup(int, int, struct test *);
122172106Srwatsonvoid	priv_io(int, int, struct test *);
123172106Srwatsonvoid	priv_io_cleanup(int, int, struct test *);
124172106Srwatson
125172106Srwatsonint	priv_kenv_set_setup(int, int, struct test *);
126172106Srwatsonvoid	priv_kenv_set(int, int, struct test *);
127172106Srwatsonvoid	priv_kenv_set_cleanup(int, int, struct test *);
128172106Srwatson
129172106Srwatsonint	priv_kenv_unset_setup(int, int, struct test *);
130172106Srwatsonvoid	priv_kenv_unset(int, int, struct test *);
131172106Srwatsonvoid	priv_kenv_unset_cleanup(int, int, struct test *);
132172106Srwatson
133172106Srwatsonint	priv_msgbuf_privonly_setup(int, int, struct test *);
134172106Srwatsonvoid	priv_msgbuf_privonly(int, int, struct test *);
135172106Srwatson
136172106Srwatsonint	priv_msgbuf_unprivok_setup(int, int, struct test *);
137172106Srwatsonvoid	priv_msgbuf_unprivok(int, int, struct test *);
138172106Srwatson
139172106Srwatsonvoid	priv_msgbuf_cleanup(int, int, struct test *);
140172106Srwatson
141173578Sbzvoid	priv_netinet_ipsec_pfkey(int, int, struct test *);
142173679Sbzint	priv_netinet_ipsec_policy4_bypass_setup(int, int, struct test *);
143173679Sbzvoid	priv_netinet_ipsec_policy4_bypass(int, int, struct test *);
144173679Sbzint	priv_netinet_ipsec_policy6_bypass_setup(int, int, struct test *);
145173679Sbzvoid	priv_netinet_ipsec_policy6_bypass(int, int, struct test *);
146173679Sbzvoid	priv_netinet_ipsec_policy_bypass_cleanup(int, int, struct test *);
147173679Sbzint	priv_netinet_ipsec_policy4_entrust_setup(int, int, struct test *);
148173679Sbzvoid	priv_netinet_ipsec_policy4_entrust(int, int, struct test *);
149173679Sbzint	priv_netinet_ipsec_policy6_entrust_setup(int, int, struct test *);
150173679Sbzvoid	priv_netinet_ipsec_policy6_entrust(int, int, struct test *);
151173679Sbzvoid	priv_netinet_ipsec_policy_entrust_cleanup(int, int, struct test *);
152173578Sbz
153172106Srwatsonint	priv_netinet_raw_setup(int, int, struct test *);
154172106Srwatsonvoid	priv_netinet_raw(int, int, struct test *);
155172106Srwatsonvoid	priv_netinet_raw_cleanup(int, int, struct test *);
156172106Srwatson
157172106Srwatsonint	priv_proc_setlogin_setup(int, int, struct test *);
158172106Srwatsonvoid	priv_proc_setlogin(int, int, struct test *);
159172106Srwatsonvoid	priv_proc_setlogin_cleanup(int, int, struct test *);
160172106Srwatson
161172106Srwatsonint	priv_proc_setrlimit_setup(int, int, struct test *);
162172106Srwatsonvoid	priv_proc_setrlimit_raisemax(int, int, struct test *);
163172106Srwatsonvoid	priv_proc_setrlimit_raisecur(int, int, struct test *);
164172106Srwatsonvoid	priv_proc_setrlimit_raisecur_nopriv(int, int, struct test *);
165172106Srwatsonvoid	priv_proc_setrlimit_cleanup(int, int, struct test *);
166172106Srwatson
167172106Srwatsonint	priv_sched_rtprio_setup(int, int, struct test *);
168172106Srwatsonvoid	priv_sched_rtprio_curproc_normal(int, int, struct test *);
169172106Srwatsonvoid	priv_sched_rtprio_curproc_idle(int, int, struct test *);
170172106Srwatsonvoid	priv_sched_rtprio_curproc_realtime(int, int, struct test *);
171172106Srwatson
172172106Srwatsonvoid	priv_sched_rtprio_myproc_normal(int, int, struct test *);
173172106Srwatsonvoid	priv_sched_rtprio_myproc_idle(int, int, struct test *);
174172106Srwatsonvoid	priv_sched_rtprio_myproc_realtime(int, int, struct test *);
175172106Srwatson
176172106Srwatsonvoid	priv_sched_rtprio_aproc_normal(int, int, struct test *);
177172106Srwatsonvoid	priv_sched_rtprio_aproc_idle(int, int, struct test *);
178172106Srwatsonvoid	priv_sched_rtprio_aproc_realtime(int, int, struct test *);
179172106Srwatsonvoid	priv_sched_rtprio_cleanup(int, int, struct test *);
180172106Srwatson
181172106Srwatsonint	priv_sched_setpriority_setup(int, int, struct test *);
182172106Srwatsonvoid	priv_sched_setpriority_curproc(int, int, struct test *);
183172106Srwatsonvoid	priv_sched_setpriority_myproc(int, int, struct test *);
184172106Srwatsonvoid	priv_sched_setpriority_aproc(int, int, struct test *);
185172106Srwatsonvoid	priv_sched_setpriority_cleanup(int, int, struct test *);
186172106Srwatson
187172106Srwatsonint	priv_settimeofday_setup(int, int, struct test *);
188172106Srwatsonvoid	priv_settimeofday(int, int, struct test *);
189172106Srwatsonvoid	priv_settimeofday_cleanup(int, int, struct test *);
190172106Srwatson
191172106Srwatsonint	priv_sysctl_write_setup(int, int, struct test *);
192172106Srwatsonvoid	priv_sysctl_write(int, int, struct test *);
193172106Srwatsonvoid	priv_sysctl_writejail(int, int, struct test *);
194172106Srwatsonvoid	priv_sysctl_write_cleanup(int, int, struct test *);
195172106Srwatson
196172106Srwatsonint	priv_vfs_chflags_froot_setup(int, int, struct test *);
197172106Srwatsonvoid	priv_vfs_chflags_froot_uflags(int, int, struct test *);
198172106Srwatsonvoid	priv_vfs_chflags_froot_sflags(int, int, struct test *);
199172106Srwatson
200172106Srwatsonint	priv_vfs_chflags_fowner_setup(int, int, struct test *);
201172106Srwatsonvoid	priv_vfs_chflags_fowner_uflags(int, int, struct test *);
202172106Srwatsonvoid	priv_vfs_chflags_fowner_sflags(int, int, struct test *);
203172106Srwatson
204172106Srwatsonint	priv_vfs_chflags_fother_setup(int, int, struct test *);
205172106Srwatsonvoid	priv_vfs_chflags_fother_uflags(int, int, struct test *);
206172106Srwatsonvoid	priv_vfs_chflags_fother_sflags(int, int, struct test *);
207172106Srwatson
208172106Srwatsonvoid	priv_vfs_chflags_cleanup(int, int, struct test *);
209172106Srwatson
210172106Srwatsonint	priv_vfs_chmod_froot_setup(int, int, struct test *);
211172106Srwatsonvoid	priv_vfs_chmod_froot(int, int, struct test *);
212172106Srwatson
213172106Srwatsonint	priv_vfs_chmod_fowner_setup(int, int, struct test *);
214172106Srwatsonvoid	priv_vfs_chmod_fowner(int, int, struct test *);
215172106Srwatson
216172106Srwatsonint	priv_vfs_chmod_fother_setup(int, int, struct test *);
217172106Srwatsonvoid	priv_vfs_chmod_fother(int, int, struct test *);
218172106Srwatson
219172106Srwatsonvoid	priv_vfs_chmod_cleanup(int, int, struct test *);
220172106Srwatson
221172106Srwatsonint	priv_vfs_chown_uid_setup(int, int, struct test *);
222172106Srwatsonvoid	priv_vfs_chown_uid(int, int, struct test *);
223172106Srwatson
224172106Srwatsonint	priv_vfs_chown_mygid_setup(int, int, struct test *);
225172106Srwatsonvoid	priv_vfs_chown_mygid(int, int, struct test *);
226172106Srwatson
227172106Srwatsonint	priv_vfs_chown_othergid_setup(int, int, struct test *);
228172106Srwatsonvoid	priv_vfs_chown_othergid(int, int, struct test *);
229172106Srwatson
230172106Srwatsonvoid	priv_vfs_chown_cleanup(int, int, struct test *);
231172106Srwatson
232172106Srwatsonint	priv_vfs_chroot_setup(int, int, struct test *);
233172106Srwatsonvoid	priv_vfs_chroot(int, int, struct test *);
234172106Srwatsonvoid	priv_vfs_chroot_cleanup(int, int, struct test *);
235172106Srwatson
236172106Srwatsonint	priv_vfs_clearsugid_setup(int, int, struct test *);
237172106Srwatsonvoid	priv_vfs_clearsugid_chgrp(int, int, struct test *);
238172106Srwatsonvoid	priv_vfs_clearsugid_extattr(int, int, struct test *);
239172106Srwatsonvoid	priv_vfs_clearsugid_write(int, int, struct test *);
240172106Srwatsonvoid	priv_vfs_clearsugid_cleanup(int, int, struct test *);
241172106Srwatson
242172106Srwatsonint	priv_vfs_extattr_system_setup(int, int, struct test *);
243172106Srwatsonvoid	priv_vfs_extattr_system(int, int, struct test *);
244172106Srwatsonvoid	priv_vfs_extattr_system_cleanup(int, int, struct test *);
245172106Srwatson
246172106Srwatsonint	priv_vfs_fhopen_setup(int, int, struct test *);
247172106Srwatsonvoid	priv_vfs_fhopen(int, int, struct test *);
248172106Srwatsonvoid	priv_vfs_fhopen_cleanup(int, int, struct test *);
249172106Srwatson
250172106Srwatsonint	priv_vfs_fhstat_setup(int, int, struct test *);
251172106Srwatsonvoid	priv_vfs_fhstat(int, int, struct test *);
252172106Srwatsonvoid	priv_vfs_fhstat_cleanup(int, int, struct test *);
253172106Srwatson
254172106Srwatsonint	priv_vfs_fhstatfs_setup(int, int, struct test *);
255172106Srwatsonvoid	priv_vfs_fhstatfs(int, int, struct test *);
256172106Srwatsonvoid	priv_vfs_fhstatfs_cleanup(int, int, struct test *);
257172106Srwatson
258172106Srwatsonint	priv_vfs_generation_setup(int, int, struct test *);
259172106Srwatsonvoid	priv_vfs_generation(int, int, struct test *);
260172106Srwatsonvoid	priv_vfs_generation_cleanup(int, int, struct test *);
261172106Srwatson
262172106Srwatsonint	priv_vfs_getfh_setup(int, int, struct test *);
263172106Srwatsonvoid	priv_vfs_getfh(int, int, struct test *);
264172106Srwatsonvoid	priv_vfs_getfh_cleanup(int, int, struct test *);
265172106Srwatson
266172106Srwatsonint	priv_vfs_readwrite_fowner_setup(int, int, struct test *);
267172106Srwatsonvoid	priv_vfs_readwrite_fowner(int, int, struct test *);
268172106Srwatson
269172106Srwatsonint	priv_vfs_readwrite_fgroup_setup(int, int, struct test *);
270172106Srwatsonvoid	priv_vfs_readwrite_fgroup(int, int, struct test *);
271172106Srwatson
272172106Srwatsonint	priv_vfs_readwrite_fother_setup(int, int, struct test *);
273172106Srwatsonvoid	priv_vfs_readwrite_fother(int, int, struct test *);
274172106Srwatson
275172106Srwatsonvoid	priv_vfs_readwrite_cleanup(int, int, struct test *);
276172106Srwatson
277172106Srwatsonint	priv_vfs_setgid_fowner_setup(int, int, struct test *);
278172106Srwatsonvoid	priv_vfs_setgid_fowner(int, int, struct test *);
279172106Srwatson
280172106Srwatsonint	priv_vfs_setgid_fother_setup(int, int, struct test *);
281172106Srwatsonvoid	priv_vfs_setgid_fother(int, int, struct test *);
282172106Srwatson
283172106Srwatsonvoid	priv_vfs_setgid_cleanup(int, int, struct test *);
284172106Srwatson
285172106Srwatsonint	priv_vfs_stickyfile_dir_fowner_setup(int, int, struct test *);
286172106Srwatson
287172106Srwatsonvoid	priv_vfs_stickyfile_dir_fowner(int, int, struct test *);
288172106Srwatsonint	priv_vfs_stickyfile_dir_fother_setup(int, int, struct test *);
289172106Srwatsonvoid	priv_vfs_stickyfile_dir_fother(int, int, struct test *);
290172106Srwatson
291172106Srwatsonvoid	priv_vfs_stickyfile_dir_cleanup(int, int, struct test *);
292172106Srwatson
293172106Srwatsonint	priv_vfs_stickyfile_file_fowner_setup(int, int, struct test *);
294172106Srwatsonvoid	priv_vfs_stickyfile_file_fowner(int, int, struct test *);
295172106Srwatson
296172106Srwatsonint	priv_vfs_stickyfile_file_fother_setup(int, int, struct test *);
297172106Srwatsonvoid	priv_vfs_stickyfile_file_fother(int, int, struct test *);
298172106Srwatson
299172106Srwatsonvoid	priv_vfs_stickyfile_file_cleanup(int, int, struct test *);
300172106Srwatson
301172106Srwatsonint	priv_vfs_utimes_froot_setup(int, int, struct test *);
302172106Srwatsonvoid	priv_vfs_utimes_froot(int, int, struct test *);
303172106Srwatsonvoid	priv_vfs_utimes_froot_null(int, int, struct test *);
304172106Srwatson
305172106Srwatsonint	priv_vfs_utimes_fowner_setup(int, int, struct test *);
306172106Srwatsonvoid	priv_vfs_utimes_fowner(int, int, struct test *);
307172106Srwatsonvoid	priv_vfs_utimes_fowner_null(int, int, struct test *);
308172106Srwatson
309172106Srwatsonint	priv_vfs_utimes_fother_setup(int, int, struct test *);
310172106Srwatsonvoid	priv_vfs_utimes_fother(int, int, struct test *);
311172106Srwatsonvoid	priv_vfs_utimes_fother_null(int, int, struct test *);
312172106Srwatson
313172106Srwatsonvoid	priv_vfs_utimes_cleanup(int, int, struct test *);
314172106Srwatson
315172106Srwatsonint	priv_vm_madv_protect_setup(int, int, struct test *);
316172106Srwatsonvoid	priv_vm_madv_protect(int, int, struct test *);
317172106Srwatsonvoid	priv_vm_madv_protect_cleanup(int, int, struct test *);
318172106Srwatson
319172106Srwatsonint	priv_vm_mlock_setup(int, int, struct test *);
320172106Srwatsonvoid	priv_vm_mlock(int, int, struct test *);
321172106Srwatsonvoid	priv_vm_mlock_cleanup(int, int, struct test *);
322172106Srwatson
323172106Srwatsonint	priv_vm_munlock_setup(int, int, struct test *);
324172106Srwatsonvoid	priv_vm_munlock(int, int, struct test *);
325172106Srwatsonvoid	priv_vm_munlock_cleanup(int, int, struct test *);
326