xref: /freebsd/lib/libcasper/services/cap_fileargs/tests/fileargs_test.c (revision 3733d82c4deb49035a39e18744085d1e3e9b8dc5)
1faaf43b2SMariusz Zaborski /*-
2faaf43b2SMariusz Zaborski  * Copyright (c) 2021 Mariusz Zaborski <oshogbo@FreeBSD.org>
3faaf43b2SMariusz Zaborski  *
4faaf43b2SMariusz Zaborski  * Redistribution and use in source and binary forms, with or without
5faaf43b2SMariusz Zaborski  * modification, are permitted provided that the following conditions
6faaf43b2SMariusz Zaborski  * are met:
7faaf43b2SMariusz Zaborski  * 1. Redistributions of source code must retain the above copyright
8faaf43b2SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer.
9faaf43b2SMariusz Zaborski  * 2. Redistributions in binary form must reproduce the above copyright
10faaf43b2SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer in the
11faaf43b2SMariusz Zaborski  *    documentation and/or other materials provided with the distribution.
12faaf43b2SMariusz Zaborski  *
13faaf43b2SMariusz Zaborski  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
14faaf43b2SMariusz Zaborski  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
15faaf43b2SMariusz Zaborski  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16faaf43b2SMariusz Zaborski  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
17faaf43b2SMariusz Zaborski  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18faaf43b2SMariusz Zaborski  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19faaf43b2SMariusz Zaborski  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20faaf43b2SMariusz Zaborski  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21faaf43b2SMariusz Zaborski  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22faaf43b2SMariusz Zaborski  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23faaf43b2SMariusz Zaborski  * POSSIBILITY OF SUCH DAMAGE.
24faaf43b2SMariusz Zaborski  */
25faaf43b2SMariusz Zaborski 
26faaf43b2SMariusz Zaborski #include <sys/param.h>
27faaf43b2SMariusz Zaborski #include <sys/capsicum.h>
28faaf43b2SMariusz Zaborski #include <sys/stat.h>
29faaf43b2SMariusz Zaborski 
30faaf43b2SMariusz Zaborski #include <errno.h>
31faaf43b2SMariusz Zaborski #include <fcntl.h>
32faaf43b2SMariusz Zaborski #include <stdio.h>
33faaf43b2SMariusz Zaborski 
34faaf43b2SMariusz Zaborski #include <atf-c.h>
35faaf43b2SMariusz Zaborski 
36faaf43b2SMariusz Zaborski #include <libcasper.h>
37faaf43b2SMariusz Zaborski #include <casper/cap_fileargs.h>
38faaf43b2SMariusz Zaborski 
39f1c010d9SOlivier Cochard #include "freebsd_test_suite/macros.h"
40f1c010d9SOlivier Cochard 
41faaf43b2SMariusz Zaborski #define MAX_FILES		200
42faaf43b2SMariusz Zaborski 
43faaf43b2SMariusz Zaborski static char *files[MAX_FILES];
44faaf43b2SMariusz Zaborski static int fds[MAX_FILES];
45faaf43b2SMariusz Zaborski 
46faaf43b2SMariusz Zaborski #define	TEST_FILE	"/etc/passwd"
47faaf43b2SMariusz Zaborski 
48faaf43b2SMariusz Zaborski static void
check_capsicum(void)49f1c010d9SOlivier Cochard check_capsicum(void)
50f1c010d9SOlivier Cochard {
51f1c010d9SOlivier Cochard 	ATF_REQUIRE_FEATURE("security_capabilities");
52f1c010d9SOlivier Cochard 	ATF_REQUIRE_FEATURE("security_capability_mode");
53f1c010d9SOlivier Cochard }
54f1c010d9SOlivier Cochard 
55f1c010d9SOlivier Cochard static void
prepare_files(size_t num,bool create)56faaf43b2SMariusz Zaborski prepare_files(size_t num, bool create)
57faaf43b2SMariusz Zaborski {
58faaf43b2SMariusz Zaborski 	const char template[] = "testsfiles.XXXXXXXX";
59faaf43b2SMariusz Zaborski 	size_t i;
60faaf43b2SMariusz Zaborski 
61faaf43b2SMariusz Zaborski 	for (i = 0; i < num; i++) {
62faaf43b2SMariusz Zaborski 		files[i] = calloc(1, sizeof(template));
63faaf43b2SMariusz Zaborski 		ATF_REQUIRE(files[i] != NULL);
64faaf43b2SMariusz Zaborski 		strncpy(files[i], template, sizeof(template) - 1);
65faaf43b2SMariusz Zaborski 
66faaf43b2SMariusz Zaborski 		if (create) {
67faaf43b2SMariusz Zaborski 			fds[i] = mkstemp(files[i]);
68faaf43b2SMariusz Zaborski 			ATF_REQUIRE(fds[i] >= 0);
69faaf43b2SMariusz Zaborski 		} else {
70faaf43b2SMariusz Zaborski 			fds[i] = -1;
71faaf43b2SMariusz Zaborski 			ATF_REQUIRE(mktemp(files[i]) != NULL);
72faaf43b2SMariusz Zaborski 		}
73faaf43b2SMariusz Zaborski 	}
74faaf43b2SMariusz Zaborski }
75faaf43b2SMariusz Zaborski 
76faaf43b2SMariusz Zaborski static void
clear_files(void)77faaf43b2SMariusz Zaborski clear_files(void)
78faaf43b2SMariusz Zaborski {
79faaf43b2SMariusz Zaborski 	size_t i;
80faaf43b2SMariusz Zaborski 
81faaf43b2SMariusz Zaborski 
82faaf43b2SMariusz Zaborski 	for (i = 0; files[i] != NULL; i++) {
83faaf43b2SMariusz Zaborski 		unlink(files[i]);
84faaf43b2SMariusz Zaborski 		free(files[i]);
85faaf43b2SMariusz Zaborski 		if (fds[i] != -1)
86faaf43b2SMariusz Zaborski 			close(fds[i]);
87faaf43b2SMariusz Zaborski 	}
88faaf43b2SMariusz Zaborski }
89faaf43b2SMariusz Zaborski 
90faaf43b2SMariusz Zaborski static int
test_file_open(fileargs_t * fa,const char * file,int * fdp)91faaf43b2SMariusz Zaborski test_file_open(fileargs_t *fa, const char *file, int *fdp)
92faaf43b2SMariusz Zaborski {
93faaf43b2SMariusz Zaborski 	int fd;
94faaf43b2SMariusz Zaborski 
95faaf43b2SMariusz Zaborski 	fd = fileargs_open(fa, file);
96faaf43b2SMariusz Zaborski 	if (fd < 0)
97faaf43b2SMariusz Zaborski 		return (errno);
98faaf43b2SMariusz Zaborski 
99faaf43b2SMariusz Zaborski 	if (fdp != NULL) {
100faaf43b2SMariusz Zaborski 		*fdp = fd;
101faaf43b2SMariusz Zaborski 	}
102faaf43b2SMariusz Zaborski 
103faaf43b2SMariusz Zaborski 	return (0);
104faaf43b2SMariusz Zaborski }
105faaf43b2SMariusz Zaborski 
106faaf43b2SMariusz Zaborski static int
test_file_fopen(fileargs_t * fa,const char * file,const char * mode,FILE ** retfile)107faaf43b2SMariusz Zaborski test_file_fopen(fileargs_t *fa, const char *file, const char *mode,
108faaf43b2SMariusz Zaborski     FILE **retfile)
109faaf43b2SMariusz Zaborski {
110faaf43b2SMariusz Zaborski 	FILE *pfile;
111faaf43b2SMariusz Zaborski 
112faaf43b2SMariusz Zaborski 	pfile = fileargs_fopen(fa, file, mode);
113faaf43b2SMariusz Zaborski 	if (pfile == NULL)
114faaf43b2SMariusz Zaborski 		return (errno);
115faaf43b2SMariusz Zaborski 
116faaf43b2SMariusz Zaborski 	if (retfile != NULL) {
117faaf43b2SMariusz Zaborski 		*retfile = pfile;
118faaf43b2SMariusz Zaborski 	}
119faaf43b2SMariusz Zaborski 
120faaf43b2SMariusz Zaborski 	return (0);
121faaf43b2SMariusz Zaborski }
122faaf43b2SMariusz Zaborski 
123faaf43b2SMariusz Zaborski static int
test_file_lstat(fileargs_t * fa,const char * file)124faaf43b2SMariusz Zaborski test_file_lstat(fileargs_t *fa, const char *file)
125faaf43b2SMariusz Zaborski {
126faaf43b2SMariusz Zaborski 	struct stat fasb, origsb;
127faaf43b2SMariusz Zaborski 	bool equals;
128faaf43b2SMariusz Zaborski 
129faaf43b2SMariusz Zaborski 	if (fileargs_lstat(fa, file, &fasb) < 0)
130faaf43b2SMariusz Zaborski 		return (errno);
131faaf43b2SMariusz Zaborski 
132faaf43b2SMariusz Zaborski 	ATF_REQUIRE(lstat(file, &origsb) == 0);
133faaf43b2SMariusz Zaborski 
134faaf43b2SMariusz Zaborski 	equals = true;
135faaf43b2SMariusz Zaborski 	equals &= (origsb.st_dev == fasb.st_dev);
136faaf43b2SMariusz Zaborski 	equals &= (origsb.st_ino == fasb.st_ino);
137faaf43b2SMariusz Zaborski 	equals &= (origsb.st_nlink == fasb.st_nlink);
138faaf43b2SMariusz Zaborski 	equals &= (origsb.st_flags == fasb.st_flags);
139faaf43b2SMariusz Zaborski 	equals &= (memcmp(&origsb.st_ctim, &fasb.st_ctim,
140faaf43b2SMariusz Zaborski 	    sizeof(fasb.st_ctim)) == 0);
141faaf43b2SMariusz Zaborski 	equals &= (memcmp(&origsb.st_birthtim, &fasb.st_birthtim,
142faaf43b2SMariusz Zaborski 	    sizeof(fasb.st_birthtim)) == 0);
143faaf43b2SMariusz Zaborski 	if (!equals) {
144faaf43b2SMariusz Zaborski 		return (EINVAL);
145faaf43b2SMariusz Zaborski 	}
146faaf43b2SMariusz Zaborski 
147faaf43b2SMariusz Zaborski 	return (0);
148faaf43b2SMariusz Zaborski }
149faaf43b2SMariusz Zaborski 
150faaf43b2SMariusz Zaborski static int
test_file_realpath_static(fileargs_t * fa,const char * file)151dcdad299SMariusz Zaborski test_file_realpath_static(fileargs_t *fa, const char *file)
152dcdad299SMariusz Zaborski {
153dcdad299SMariusz Zaborski 	char fapath[PATH_MAX], origpath[PATH_MAX];
154dcdad299SMariusz Zaborski 
155dcdad299SMariusz Zaborski 	if (fileargs_realpath(fa, file, fapath) == NULL)
156dcdad299SMariusz Zaborski 		return (errno);
157dcdad299SMariusz Zaborski 
158dcdad299SMariusz Zaborski 	ATF_REQUIRE(realpath(file, origpath) != NULL);
159dcdad299SMariusz Zaborski 
160dcdad299SMariusz Zaborski 	if (strcmp(fapath, origpath) != 0)
161dcdad299SMariusz Zaborski 		return (EINVAL);
162dcdad299SMariusz Zaborski 
163dcdad299SMariusz Zaborski 	return (0);
164dcdad299SMariusz Zaborski }
165dcdad299SMariusz Zaborski 
166dcdad299SMariusz Zaborski static int
test_file_realpath_alloc(fileargs_t * fa,const char * file)167dcdad299SMariusz Zaborski test_file_realpath_alloc(fileargs_t *fa, const char *file)
168dcdad299SMariusz Zaborski {
169dcdad299SMariusz Zaborski 	char *fapath, *origpath;
170dcdad299SMariusz Zaborski 	int serrno;
171dcdad299SMariusz Zaborski 
172dcdad299SMariusz Zaborski 	fapath = fileargs_realpath(fa, file, NULL);
173dcdad299SMariusz Zaborski 	if (fapath == NULL)
174dcdad299SMariusz Zaborski 		return (errno);
175dcdad299SMariusz Zaborski 
176dcdad299SMariusz Zaborski 	origpath = realpath(file, NULL);
177dcdad299SMariusz Zaborski 	ATF_REQUIRE(origpath != NULL);
178dcdad299SMariusz Zaborski 
179dcdad299SMariusz Zaborski 	serrno = 0;
180dcdad299SMariusz Zaborski 	if (strcmp(fapath, origpath) != 0)
181dcdad299SMariusz Zaborski 		serrno = EINVAL;
182dcdad299SMariusz Zaborski 
183dcdad299SMariusz Zaborski 	free(fapath);
184dcdad299SMariusz Zaborski 	free(origpath);
185dcdad299SMariusz Zaborski 
186dcdad299SMariusz Zaborski 	return (serrno);
187dcdad299SMariusz Zaborski }
188dcdad299SMariusz Zaborski 
189dcdad299SMariusz Zaborski static int
test_file_realpath(fileargs_t * fa,const char * file)190dcdad299SMariusz Zaborski test_file_realpath(fileargs_t *fa, const char *file)
191dcdad299SMariusz Zaborski {
192dcdad299SMariusz Zaborski 	int serrno;
193dcdad299SMariusz Zaborski 
194dcdad299SMariusz Zaborski 	serrno = test_file_realpath_static(fa, file);
195dcdad299SMariusz Zaborski 	if (serrno != 0)
196dcdad299SMariusz Zaborski 		return serrno;
197dcdad299SMariusz Zaborski 
198dcdad299SMariusz Zaborski 	return (test_file_realpath_alloc(fa, file));
199dcdad299SMariusz Zaborski }
200dcdad299SMariusz Zaborski 
201dcdad299SMariusz Zaborski static int
test_file_mode(int fd,int mode)202faaf43b2SMariusz Zaborski test_file_mode(int fd, int mode)
203faaf43b2SMariusz Zaborski {
204faaf43b2SMariusz Zaborski 	int flags;
205faaf43b2SMariusz Zaborski 
206faaf43b2SMariusz Zaborski 	flags = fcntl(fd, F_GETFL, 0);
207faaf43b2SMariusz Zaborski 	if (flags < 0)
208faaf43b2SMariusz Zaborski 		return (errno);
209faaf43b2SMariusz Zaborski 
210faaf43b2SMariusz Zaborski 	if ((flags & O_ACCMODE) != mode)
211faaf43b2SMariusz Zaborski 		return (errno);
212faaf43b2SMariusz Zaborski 
213faaf43b2SMariusz Zaborski 	return (0);
214faaf43b2SMariusz Zaborski }
215faaf43b2SMariusz Zaborski 
216faaf43b2SMariusz Zaborski static bool
test_file_cap(int fd,cap_rights_t * rights)217faaf43b2SMariusz Zaborski test_file_cap(int fd, cap_rights_t *rights)
218faaf43b2SMariusz Zaborski {
219faaf43b2SMariusz Zaborski 	cap_rights_t fdrights;
220faaf43b2SMariusz Zaborski 
221faaf43b2SMariusz Zaborski 	ATF_REQUIRE(cap_rights_get(fd, &fdrights) == 0);
222faaf43b2SMariusz Zaborski 
223faaf43b2SMariusz Zaborski 	return (cap_rights_contains(&fdrights, rights));
224faaf43b2SMariusz Zaborski }
225faaf43b2SMariusz Zaborski 
226faaf43b2SMariusz Zaborski static int
test_file_write(int fd)227faaf43b2SMariusz Zaborski test_file_write(int fd)
228faaf43b2SMariusz Zaborski {
229faaf43b2SMariusz Zaborski 	char buf;
230faaf43b2SMariusz Zaborski 
231faaf43b2SMariusz Zaborski 	buf = 't';
232faaf43b2SMariusz Zaborski 	if (write(fd, &buf, sizeof(buf)) != sizeof(buf)) {
233faaf43b2SMariusz Zaborski 		return (errno);
234faaf43b2SMariusz Zaborski 	}
235faaf43b2SMariusz Zaborski 
236faaf43b2SMariusz Zaborski 	return (0);
237faaf43b2SMariusz Zaborski }
238faaf43b2SMariusz Zaborski 
239faaf43b2SMariusz Zaborski static int
test_file_read(int fd)240faaf43b2SMariusz Zaborski test_file_read(int fd)
241faaf43b2SMariusz Zaborski {
242faaf43b2SMariusz Zaborski 	char buf;
243faaf43b2SMariusz Zaborski 
244faaf43b2SMariusz Zaborski 	if (read(fd, &buf, sizeof(buf)) < 0) {
245faaf43b2SMariusz Zaborski 		return (errno);
246faaf43b2SMariusz Zaborski 	}
247faaf43b2SMariusz Zaborski 
248faaf43b2SMariusz Zaborski 	return (0);
249faaf43b2SMariusz Zaborski }
250faaf43b2SMariusz Zaborski 
251faaf43b2SMariusz Zaborski static int
test_file_fwrite(FILE * pfile)252faaf43b2SMariusz Zaborski test_file_fwrite(FILE *pfile)
253faaf43b2SMariusz Zaborski {
254faaf43b2SMariusz Zaborski 	char buf;
255faaf43b2SMariusz Zaborski 
256faaf43b2SMariusz Zaborski 	buf = 't';
257faaf43b2SMariusz Zaborski 	if (fwrite(&buf, sizeof(buf), 1, pfile) != sizeof(buf))
258faaf43b2SMariusz Zaborski 		return (errno);
259faaf43b2SMariusz Zaborski 
260faaf43b2SMariusz Zaborski 	return (0);
261faaf43b2SMariusz Zaborski }
262faaf43b2SMariusz Zaborski 
263faaf43b2SMariusz Zaborski static int
test_file_fread(FILE * pfile)264faaf43b2SMariusz Zaborski test_file_fread(FILE *pfile)
265faaf43b2SMariusz Zaborski {
266faaf43b2SMariusz Zaborski 	char buf;
267faaf43b2SMariusz Zaborski 	int ret, serrno;
268faaf43b2SMariusz Zaborski 
269faaf43b2SMariusz Zaborski 	errno = 0;
270faaf43b2SMariusz Zaborski 	ret = fread(&buf, sizeof(buf), 1, pfile);
271faaf43b2SMariusz Zaborski 	serrno = errno;
272faaf43b2SMariusz Zaborski 	if (ret < 0) {
273faaf43b2SMariusz Zaborski 		return (serrno);
274faaf43b2SMariusz Zaborski 	} else if (ret == 0 && feof(pfile) == 0) {
275faaf43b2SMariusz Zaborski 		return (serrno != 0 ? serrno : EINVAL);
276faaf43b2SMariusz Zaborski 	}
277faaf43b2SMariusz Zaborski 
278faaf43b2SMariusz Zaborski 	return (0);
279faaf43b2SMariusz Zaborski }
280faaf43b2SMariusz Zaborski 
281faaf43b2SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__open_read);
ATF_TC_HEAD(fileargs__open_read,tc)282faaf43b2SMariusz Zaborski ATF_TC_HEAD(fileargs__open_read, tc) {}
ATF_TC_BODY(fileargs__open_read,tc)283faaf43b2SMariusz Zaborski ATF_TC_BODY(fileargs__open_read, tc)
284faaf43b2SMariusz Zaborski {
285faaf43b2SMariusz Zaborski 	cap_rights_t rights, norights;
286faaf43b2SMariusz Zaborski 	fileargs_t *fa;
287faaf43b2SMariusz Zaborski 	size_t i;
288faaf43b2SMariusz Zaborski 	int fd;
289faaf43b2SMariusz Zaborski 
290f1c010d9SOlivier Cochard 	check_capsicum();
291f1c010d9SOlivier Cochard 
292faaf43b2SMariusz Zaborski 	prepare_files(MAX_FILES, true);
293faaf43b2SMariusz Zaborski 
294*3733d82cSEd Maste 	cap_rights_init(&rights, CAP_READ, CAP_FCNTL);
295faaf43b2SMariusz Zaborski 	cap_rights_init(&norights, CAP_WRITE);
296faaf43b2SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, O_RDONLY, 0, &rights,
297faaf43b2SMariusz Zaborski 	    FA_OPEN);
298faaf43b2SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
299faaf43b2SMariusz Zaborski 
300faaf43b2SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
301faaf43b2SMariusz Zaborski 		/* ALLOWED */
302faaf43b2SMariusz Zaborski 		/* We open file twice to check if we can. */
303faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
304faaf43b2SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
305faaf43b2SMariusz Zaborski 
306faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
307faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_mode(fd, O_RDONLY) == 0);
308faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &rights) == true);
309faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_read(fd) == 0);
310faaf43b2SMariusz Zaborski 
311faaf43b2SMariusz Zaborski 		/* DISALLOWED */
312faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);
313faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);
314faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &norights) == false);
315faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_write(fd) == ENOTCAPABLE);
316dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);
317dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);
318faaf43b2SMariusz Zaborski 
319faaf43b2SMariusz Zaborski 		/* CLOSE */
320faaf43b2SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
321faaf43b2SMariusz Zaborski 	}
322faaf43b2SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__open_read,tc)323faaf43b2SMariusz Zaborski ATF_TC_CLEANUP(fileargs__open_read, tc)
324faaf43b2SMariusz Zaborski {
325faaf43b2SMariusz Zaborski 	clear_files();
326faaf43b2SMariusz Zaborski }
327faaf43b2SMariusz Zaborski 
328faaf43b2SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__open_write);
ATF_TC_HEAD(fileargs__open_write,tc)329faaf43b2SMariusz Zaborski ATF_TC_HEAD(fileargs__open_write, tc) {}
ATF_TC_BODY(fileargs__open_write,tc)330faaf43b2SMariusz Zaborski ATF_TC_BODY(fileargs__open_write, tc)
331faaf43b2SMariusz Zaborski {
332faaf43b2SMariusz Zaborski 	cap_rights_t rights, norights;
333faaf43b2SMariusz Zaborski 	fileargs_t *fa;
334faaf43b2SMariusz Zaborski 	size_t i;
335faaf43b2SMariusz Zaborski 	int fd;
336faaf43b2SMariusz Zaborski 
337f1c010d9SOlivier Cochard 	check_capsicum();
338f1c010d9SOlivier Cochard 
339faaf43b2SMariusz Zaborski 	prepare_files(MAX_FILES, true);
340faaf43b2SMariusz Zaborski 
341*3733d82cSEd Maste 	cap_rights_init(&rights, CAP_WRITE, CAP_FCNTL);
342faaf43b2SMariusz Zaborski 	cap_rights_init(&norights, CAP_READ);
343faaf43b2SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, O_WRONLY, 0, &rights,
344faaf43b2SMariusz Zaborski 	    FA_OPEN);
345faaf43b2SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
346faaf43b2SMariusz Zaborski 
347faaf43b2SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
348faaf43b2SMariusz Zaborski 		/* ALLOWED */
349faaf43b2SMariusz Zaborski 		/* We open file twice to check if we can. */
350faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
351faaf43b2SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
352faaf43b2SMariusz Zaborski 
353faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
354faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_mode(fd, O_WRONLY) == 0);
355faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &rights) == true);
356faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_write(fd) == 0);
357faaf43b2SMariusz Zaborski 
358faaf43b2SMariusz Zaborski 		/* DISALLOWED */
359faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);
360faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);
361faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &norights) == false);
362faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_read(fd) == ENOTCAPABLE);
363dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);
364dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);
365faaf43b2SMariusz Zaborski 
366faaf43b2SMariusz Zaborski 		/* CLOSE */
367faaf43b2SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
368faaf43b2SMariusz Zaborski 	}
369faaf43b2SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__open_write,tc)370faaf43b2SMariusz Zaborski ATF_TC_CLEANUP(fileargs__open_write, tc)
371faaf43b2SMariusz Zaborski {
372faaf43b2SMariusz Zaborski 	clear_files();
373faaf43b2SMariusz Zaborski }
374faaf43b2SMariusz Zaborski 
375faaf43b2SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__open_create);
ATF_TC_HEAD(fileargs__open_create,tc)376faaf43b2SMariusz Zaborski ATF_TC_HEAD(fileargs__open_create, tc) {}
ATF_TC_BODY(fileargs__open_create,tc)377faaf43b2SMariusz Zaborski ATF_TC_BODY(fileargs__open_create, tc)
378faaf43b2SMariusz Zaborski {
379faaf43b2SMariusz Zaborski 	cap_rights_t rights, norights;
380faaf43b2SMariusz Zaborski 	fileargs_t *fa;
381faaf43b2SMariusz Zaborski 	size_t i;
382faaf43b2SMariusz Zaborski 	int fd;
383faaf43b2SMariusz Zaborski 
384f1c010d9SOlivier Cochard 	check_capsicum();
385f1c010d9SOlivier Cochard 
386faaf43b2SMariusz Zaborski 	prepare_files(MAX_FILES, false);
387faaf43b2SMariusz Zaborski 
388*3733d82cSEd Maste 	cap_rights_init(&rights, CAP_WRITE, CAP_FCNTL, CAP_READ);
389faaf43b2SMariusz Zaborski 	cap_rights_init(&norights, CAP_FCHMOD);
390faaf43b2SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, O_RDWR | O_CREAT, 666,
391faaf43b2SMariusz Zaborski 	    &rights, FA_OPEN);
392faaf43b2SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
393faaf43b2SMariusz Zaborski 
394faaf43b2SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
395faaf43b2SMariusz Zaborski 		/* ALLOWED */
396faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
397faaf43b2SMariusz Zaborski 
398faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_mode(fd, O_RDWR) == 0);
399faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &rights) == true);
400faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_write(fd) == 0);
401faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_read(fd) == 0);
402faaf43b2SMariusz Zaborski 
403faaf43b2SMariusz Zaborski 		/* DISALLOWED */
404faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);
405faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);
406faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &norights) == false);
407dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);
408dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);
409faaf43b2SMariusz Zaborski 
410faaf43b2SMariusz Zaborski 		/* CLOSE */
411faaf43b2SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
412faaf43b2SMariusz Zaborski 	}
413faaf43b2SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__open_create,tc)414faaf43b2SMariusz Zaborski ATF_TC_CLEANUP(fileargs__open_create, tc)
415faaf43b2SMariusz Zaborski {
416faaf43b2SMariusz Zaborski 	clear_files();
417faaf43b2SMariusz Zaborski }
418faaf43b2SMariusz Zaborski 
419faaf43b2SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__open_with_casper);
ATF_TC_HEAD(fileargs__open_with_casper,tc)420faaf43b2SMariusz Zaborski ATF_TC_HEAD(fileargs__open_with_casper, tc) {}
ATF_TC_BODY(fileargs__open_with_casper,tc)421faaf43b2SMariusz Zaborski ATF_TC_BODY(fileargs__open_with_casper, tc)
422faaf43b2SMariusz Zaborski {
423faaf43b2SMariusz Zaborski 	cap_channel_t *capcas;
424faaf43b2SMariusz Zaborski 	cap_rights_t rights;
425faaf43b2SMariusz Zaborski 	fileargs_t *fa;
426faaf43b2SMariusz Zaborski 	size_t i;
427faaf43b2SMariusz Zaborski 	int fd;
428faaf43b2SMariusz Zaborski 
429f1c010d9SOlivier Cochard 	check_capsicum();
430f1c010d9SOlivier Cochard 
431faaf43b2SMariusz Zaborski 	prepare_files(MAX_FILES, true);
432faaf43b2SMariusz Zaborski 
433faaf43b2SMariusz Zaborski 	capcas = cap_init();
434faaf43b2SMariusz Zaborski 	ATF_REQUIRE(capcas != NULL);
435faaf43b2SMariusz Zaborski 
436faaf43b2SMariusz Zaborski 	cap_rights_init(&rights, CAP_READ);
437faaf43b2SMariusz Zaborski 	fa = fileargs_cinit(capcas, MAX_FILES, files, O_RDONLY, 0, &rights,
438faaf43b2SMariusz Zaborski 	    FA_OPEN);
439faaf43b2SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
440faaf43b2SMariusz Zaborski 
441faaf43b2SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
442faaf43b2SMariusz Zaborski 		/* ALLOWED */
443faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
444faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_read(fd) == 0);
445faaf43b2SMariusz Zaborski 
446faaf43b2SMariusz Zaborski 		/* CLOSE */
447faaf43b2SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
448faaf43b2SMariusz Zaborski 	}
449faaf43b2SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__open_with_casper,tc)450faaf43b2SMariusz Zaborski ATF_TC_CLEANUP(fileargs__open_with_casper, tc)
451faaf43b2SMariusz Zaborski {
452faaf43b2SMariusz Zaborski 	clear_files();
453faaf43b2SMariusz Zaborski }
454faaf43b2SMariusz Zaborski 
455faaf43b2SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__fopen_read);
ATF_TC_HEAD(fileargs__fopen_read,tc)456faaf43b2SMariusz Zaborski ATF_TC_HEAD(fileargs__fopen_read, tc) {}
ATF_TC_BODY(fileargs__fopen_read,tc)457faaf43b2SMariusz Zaborski ATF_TC_BODY(fileargs__fopen_read, tc)
458faaf43b2SMariusz Zaborski {
459faaf43b2SMariusz Zaborski 	cap_rights_t rights, norights;
460faaf43b2SMariusz Zaborski 	fileargs_t *fa;
461faaf43b2SMariusz Zaborski 	size_t i;
462faaf43b2SMariusz Zaborski 	FILE *pfile;
463faaf43b2SMariusz Zaborski 	int fd;
464faaf43b2SMariusz Zaborski 
465f1c010d9SOlivier Cochard 	check_capsicum();
466f1c010d9SOlivier Cochard 
467faaf43b2SMariusz Zaborski 	prepare_files(MAX_FILES, true);
468faaf43b2SMariusz Zaborski 
469*3733d82cSEd Maste 	cap_rights_init(&rights, CAP_READ, CAP_FCNTL);
470faaf43b2SMariusz Zaborski 	cap_rights_init(&norights, CAP_WRITE);
471faaf43b2SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, O_RDONLY, 0, &rights,
472faaf43b2SMariusz Zaborski 	    FA_OPEN);
473faaf43b2SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
474faaf43b2SMariusz Zaborski 
475faaf43b2SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
476faaf43b2SMariusz Zaborski 		/* ALLOWED */
477faaf43b2SMariusz Zaborski 		/* We fopen file twice to check if we can. */
478faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fopen(fa, files[i], "r", &pfile) == 0);
479faaf43b2SMariusz Zaborski 		ATF_REQUIRE(fclose(pfile) == 0);
480faaf43b2SMariusz Zaborski 
481faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fopen(fa, files[i], "r", &pfile) == 0);
482faaf43b2SMariusz Zaborski 		fd = fileno(pfile);
483faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_mode(fd, O_RDONLY) == 0);
484faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &rights) == true);
485faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fread(pfile) == 0);
486faaf43b2SMariusz Zaborski 
487faaf43b2SMariusz Zaborski 		/* DISALLOWED */
488faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);
489faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fopen(fa, TEST_FILE, "r", NULL) ==
490faaf43b2SMariusz Zaborski 		    ENOTCAPABLE);
491faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &norights) == false);
492faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fwrite(pfile) == EBADF);
493dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);
494dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);
495faaf43b2SMariusz Zaborski 
496faaf43b2SMariusz Zaborski 		/* CLOSE */
497faaf43b2SMariusz Zaborski 		ATF_REQUIRE(fclose(pfile) == 0);
498faaf43b2SMariusz Zaborski 	}
499faaf43b2SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__fopen_read,tc)500faaf43b2SMariusz Zaborski ATF_TC_CLEANUP(fileargs__fopen_read, tc)
501faaf43b2SMariusz Zaborski {
502faaf43b2SMariusz Zaborski 	clear_files();
503faaf43b2SMariusz Zaborski }
504faaf43b2SMariusz Zaborski 
505faaf43b2SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__fopen_write);
ATF_TC_HEAD(fileargs__fopen_write,tc)506faaf43b2SMariusz Zaborski ATF_TC_HEAD(fileargs__fopen_write, tc) {}
ATF_TC_BODY(fileargs__fopen_write,tc)507faaf43b2SMariusz Zaborski ATF_TC_BODY(fileargs__fopen_write, tc)
508faaf43b2SMariusz Zaborski {
509faaf43b2SMariusz Zaborski 	cap_rights_t rights, norights;
510faaf43b2SMariusz Zaborski 	fileargs_t *fa;
511faaf43b2SMariusz Zaborski 	size_t i;
512faaf43b2SMariusz Zaborski 	FILE *pfile;
513faaf43b2SMariusz Zaborski 	int fd;
514faaf43b2SMariusz Zaborski 
515f1c010d9SOlivier Cochard 	check_capsicum();
516f1c010d9SOlivier Cochard 
517faaf43b2SMariusz Zaborski 	prepare_files(MAX_FILES, true);
518faaf43b2SMariusz Zaborski 
519*3733d82cSEd Maste 	cap_rights_init(&rights, CAP_WRITE, CAP_FCNTL);
520faaf43b2SMariusz Zaborski 	cap_rights_init(&norights, CAP_READ);
521faaf43b2SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, O_WRONLY, 0, &rights,
522faaf43b2SMariusz Zaborski 	    FA_OPEN);
523faaf43b2SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
524faaf43b2SMariusz Zaborski 
525faaf43b2SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
526faaf43b2SMariusz Zaborski 		/* ALLOWED */
527faaf43b2SMariusz Zaborski 		/* We fopen file twice to check if we can. */
528faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fopen(fa, files[i], "w", &pfile) == 0);
529faaf43b2SMariusz Zaborski 		ATF_REQUIRE(fclose(pfile) == 0);
530faaf43b2SMariusz Zaborski 
531faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fopen(fa, files[i], "w", &pfile) == 0);
532faaf43b2SMariusz Zaborski 		fd = fileno(pfile);
533faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_mode(fd, O_WRONLY) == 0);
534faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &rights) == true);
535faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fwrite(pfile) == 0);
536faaf43b2SMariusz Zaborski 
537faaf43b2SMariusz Zaborski 		/* DISALLOWED */
538faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);
539faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fopen(fa, TEST_FILE, "w", NULL) ==
540faaf43b2SMariusz Zaborski 		    ENOTCAPABLE);
541faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &norights) == false);
542faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fread(pfile) == EBADF);
543dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);
544dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);
545faaf43b2SMariusz Zaborski 
546faaf43b2SMariusz Zaborski 		/* CLOSE */
547faaf43b2SMariusz Zaborski 		ATF_REQUIRE(fclose(pfile) == 0);
548faaf43b2SMariusz Zaborski 	}
549faaf43b2SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__fopen_write,tc)550faaf43b2SMariusz Zaborski ATF_TC_CLEANUP(fileargs__fopen_write, tc)
551faaf43b2SMariusz Zaborski {
552faaf43b2SMariusz Zaborski 	clear_files();
553faaf43b2SMariusz Zaborski }
554faaf43b2SMariusz Zaborski 
555faaf43b2SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__fopen_create);
ATF_TC_HEAD(fileargs__fopen_create,tc)556faaf43b2SMariusz Zaborski ATF_TC_HEAD(fileargs__fopen_create, tc) {}
ATF_TC_BODY(fileargs__fopen_create,tc)557faaf43b2SMariusz Zaborski ATF_TC_BODY(fileargs__fopen_create, tc)
558faaf43b2SMariusz Zaborski {
559faaf43b2SMariusz Zaborski 	cap_rights_t rights;
560faaf43b2SMariusz Zaborski 	fileargs_t *fa;
561faaf43b2SMariusz Zaborski 	size_t i;
562faaf43b2SMariusz Zaborski 	FILE *pfile;
563faaf43b2SMariusz Zaborski 	int fd;
564faaf43b2SMariusz Zaborski 
565f1c010d9SOlivier Cochard 	check_capsicum();
566f1c010d9SOlivier Cochard 
567faaf43b2SMariusz Zaborski 	prepare_files(MAX_FILES, false);
568faaf43b2SMariusz Zaborski 
569*3733d82cSEd Maste 	cap_rights_init(&rights, CAP_READ, CAP_WRITE, CAP_FCNTL);
570faaf43b2SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, O_RDWR | O_CREAT, 0, &rights,
571faaf43b2SMariusz Zaborski 	    FA_OPEN);
572faaf43b2SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
573faaf43b2SMariusz Zaborski 
574faaf43b2SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
575faaf43b2SMariusz Zaborski 		/* ALLOWED */
576faaf43b2SMariusz Zaborski 		/* We fopen file twice to check if we can. */
577faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fopen(fa, files[i], "w+", &pfile) == 0);
578faaf43b2SMariusz Zaborski 		fd = fileno(pfile);
579faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_mode(fd, O_RDWR) == 0);
580faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &rights) == true);
581faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fwrite(pfile) == 0);
582faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fread(pfile) == 0);
583faaf43b2SMariusz Zaborski 
584faaf43b2SMariusz Zaborski 		/* DISALLOWED */
585faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);
586faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_fopen(fa, TEST_FILE, "w+", NULL) ==
587faaf43b2SMariusz Zaborski 		    ENOTCAPABLE);
588dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);
589dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);
590faaf43b2SMariusz Zaborski 
591faaf43b2SMariusz Zaborski 		/* CLOSE */
592faaf43b2SMariusz Zaborski 		ATF_REQUIRE(fclose(pfile) == 0);
593faaf43b2SMariusz Zaborski 	}
594faaf43b2SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__fopen_create,tc)595faaf43b2SMariusz Zaborski ATF_TC_CLEANUP(fileargs__fopen_create, tc)
596faaf43b2SMariusz Zaborski {
597faaf43b2SMariusz Zaborski 	clear_files();
598faaf43b2SMariusz Zaborski }
599faaf43b2SMariusz Zaborski 
600faaf43b2SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__lstat);
ATF_TC_HEAD(fileargs__lstat,tc)601faaf43b2SMariusz Zaborski ATF_TC_HEAD(fileargs__lstat, tc) {}
ATF_TC_BODY(fileargs__lstat,tc)602faaf43b2SMariusz Zaborski ATF_TC_BODY(fileargs__lstat, tc)
603faaf43b2SMariusz Zaborski {
604faaf43b2SMariusz Zaborski 	fileargs_t *fa;
605faaf43b2SMariusz Zaborski 	size_t i;
606faaf43b2SMariusz Zaborski 	int fd;
607faaf43b2SMariusz Zaborski 
608f1c010d9SOlivier Cochard 	check_capsicum();
609f1c010d9SOlivier Cochard 
610faaf43b2SMariusz Zaborski 	prepare_files(MAX_FILES, true);
611faaf43b2SMariusz Zaborski 
612faaf43b2SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, 0, 0, NULL, FA_LSTAT);
613faaf43b2SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
614faaf43b2SMariusz Zaborski 
615faaf43b2SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
616faaf43b2SMariusz Zaborski 		/* ALLOWED */
617faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == 0);
618faaf43b2SMariusz Zaborski 
619faaf43b2SMariusz Zaborski 		/* DISALLOWED */
620faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == ENOTCAPABLE);
621faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, TEST_FILE) == ENOTCAPABLE);
622faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, TEST_FILE, &fd) == ENOTCAPABLE);
623dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);
624dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);
625faaf43b2SMariusz Zaborski 	}
626faaf43b2SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__lstat,tc)627faaf43b2SMariusz Zaborski ATF_TC_CLEANUP(fileargs__lstat, tc)
628faaf43b2SMariusz Zaborski {
629faaf43b2SMariusz Zaborski 	clear_files();
630faaf43b2SMariusz Zaborski }
631faaf43b2SMariusz Zaborski 
632dcdad299SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__realpath);
ATF_TC_HEAD(fileargs__realpath,tc)633dcdad299SMariusz Zaborski ATF_TC_HEAD(fileargs__realpath, tc) {}
ATF_TC_BODY(fileargs__realpath,tc)634dcdad299SMariusz Zaborski ATF_TC_BODY(fileargs__realpath, tc)
635dcdad299SMariusz Zaborski {
636dcdad299SMariusz Zaborski 	fileargs_t *fa;
637dcdad299SMariusz Zaborski 	size_t i;
638dcdad299SMariusz Zaborski 	int fd;
639dcdad299SMariusz Zaborski 
640dcdad299SMariusz Zaborski 	prepare_files(MAX_FILES, true);
641dcdad299SMariusz Zaborski 
642dcdad299SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, 0, 0, NULL, FA_REALPATH);
643dcdad299SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
644dcdad299SMariusz Zaborski 
645dcdad299SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
646dcdad299SMariusz Zaborski 		/* ALLOWED */
647dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == 0);
648dcdad299SMariusz Zaborski 
649dcdad299SMariusz Zaborski 		/* DISALLOWED */
650dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == ENOTCAPABLE);
651dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);
652dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, TEST_FILE) == ENOTCAPABLE);
653dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, TEST_FILE, &fd) == ENOTCAPABLE);
654dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);
655dcdad299SMariusz Zaborski 	}
656dcdad299SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__realpath,tc)657dcdad299SMariusz Zaborski ATF_TC_CLEANUP(fileargs__realpath, tc)
658dcdad299SMariusz Zaborski {
659dcdad299SMariusz Zaborski 	clear_files();
660dcdad299SMariusz Zaborski }
661dcdad299SMariusz Zaborski 
662faaf43b2SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__open_lstat);
ATF_TC_HEAD(fileargs__open_lstat,tc)663faaf43b2SMariusz Zaborski ATF_TC_HEAD(fileargs__open_lstat, tc) {}
ATF_TC_BODY(fileargs__open_lstat,tc)664faaf43b2SMariusz Zaborski ATF_TC_BODY(fileargs__open_lstat, tc)
665faaf43b2SMariusz Zaborski {
666faaf43b2SMariusz Zaborski 	cap_rights_t rights, norights;
667faaf43b2SMariusz Zaborski 	fileargs_t *fa;
668faaf43b2SMariusz Zaborski 	size_t i;
669faaf43b2SMariusz Zaborski 	int fd;
670faaf43b2SMariusz Zaborski 
671f1c010d9SOlivier Cochard 	check_capsicum();
672f1c010d9SOlivier Cochard 
673faaf43b2SMariusz Zaborski 	prepare_files(MAX_FILES, true);
674faaf43b2SMariusz Zaborski 
675*3733d82cSEd Maste 	cap_rights_init(&rights, CAP_READ, CAP_FCNTL);
676faaf43b2SMariusz Zaborski 	cap_rights_init(&norights, CAP_WRITE);
677faaf43b2SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, O_RDONLY, 0, &rights,
678faaf43b2SMariusz Zaborski 	    FA_OPEN | FA_LSTAT);
679faaf43b2SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
680faaf43b2SMariusz Zaborski 
681faaf43b2SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
682faaf43b2SMariusz Zaborski 		/* ALLOWED */
683faaf43b2SMariusz Zaborski 		/* We open file twice to check if we can. */
684faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == 0);
685faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
686faaf43b2SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
687faaf43b2SMariusz Zaborski 
688faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
689faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == 0);
690faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_mode(fd, O_RDONLY) == 0);
691faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &rights) == true);
692faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_read(fd) == 0);
693faaf43b2SMariusz Zaborski 
694faaf43b2SMariusz Zaborski 		/* DISALLOWED */
695faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);
696faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &norights) == false);
697faaf43b2SMariusz Zaborski 		ATF_REQUIRE(test_file_write(fd) == ENOTCAPABLE);
698dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);
699dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);
700faaf43b2SMariusz Zaborski 
701faaf43b2SMariusz Zaborski 		/* CLOSE */
702faaf43b2SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
703faaf43b2SMariusz Zaborski 	}
704faaf43b2SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__open_lstat,tc)705faaf43b2SMariusz Zaborski ATF_TC_CLEANUP(fileargs__open_lstat, tc)
706faaf43b2SMariusz Zaborski {
707faaf43b2SMariusz Zaborski 	clear_files();
708faaf43b2SMariusz Zaborski }
709faaf43b2SMariusz Zaborski 
710dcdad299SMariusz Zaborski ATF_TC_WITH_CLEANUP(fileargs__open_realpath);
ATF_TC_HEAD(fileargs__open_realpath,tc)711dcdad299SMariusz Zaborski ATF_TC_HEAD(fileargs__open_realpath, tc) {}
ATF_TC_BODY(fileargs__open_realpath,tc)712dcdad299SMariusz Zaborski ATF_TC_BODY(fileargs__open_realpath, tc)
713dcdad299SMariusz Zaborski {
714dcdad299SMariusz Zaborski 	cap_rights_t rights, norights;
715dcdad299SMariusz Zaborski 	fileargs_t *fa;
716dcdad299SMariusz Zaborski 	size_t i;
717dcdad299SMariusz Zaborski 	int fd;
718dcdad299SMariusz Zaborski 
719f1c010d9SOlivier Cochard 	check_capsicum();
720f1c010d9SOlivier Cochard 
721dcdad299SMariusz Zaborski 	prepare_files(MAX_FILES, true);
722dcdad299SMariusz Zaborski 
723*3733d82cSEd Maste 	cap_rights_init(&rights, CAP_READ, CAP_FCNTL);
724dcdad299SMariusz Zaborski 	cap_rights_init(&norights, CAP_WRITE);
725dcdad299SMariusz Zaborski 	fa = fileargs_init(MAX_FILES, files, O_RDONLY, 0, &rights,
726dcdad299SMariusz Zaborski 	    FA_OPEN | FA_REALPATH);
727dcdad299SMariusz Zaborski 	ATF_REQUIRE(fa != NULL);
728dcdad299SMariusz Zaborski 
729dcdad299SMariusz Zaborski 	for (i = 0; i < MAX_FILES; i++) {
730dcdad299SMariusz Zaborski 		/* ALLOWED */
731dcdad299SMariusz Zaborski 		/* We open file twice to check if we can. */
732dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == 0);
733dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
734dcdad299SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
735dcdad299SMariusz Zaborski 
736dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);
737dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_realpath(fa, files[i]) == 0);
738dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_mode(fd, O_RDONLY) == 0);
739dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &rights) == true);
740dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_read(fd) == 0);
741dcdad299SMariusz Zaborski 
742dcdad299SMariusz Zaborski 		/* DISALLOWED */
743dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);
744dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_cap(fd, &norights) == false);
745dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_write(fd) == ENOTCAPABLE);
746dcdad299SMariusz Zaborski 		ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);
747dcdad299SMariusz Zaborski 
748dcdad299SMariusz Zaborski 		/* CLOSE */
749dcdad299SMariusz Zaborski 		ATF_REQUIRE(close(fd) == 0);
750dcdad299SMariusz Zaborski 	}
751dcdad299SMariusz Zaborski }
ATF_TC_CLEANUP(fileargs__open_realpath,tc)752dcdad299SMariusz Zaborski ATF_TC_CLEANUP(fileargs__open_realpath, tc)
753dcdad299SMariusz Zaborski {
754dcdad299SMariusz Zaborski 	clear_files();
755dcdad299SMariusz Zaborski }
756dcdad299SMariusz Zaborski 
ATF_TP_ADD_TCS(tp)757faaf43b2SMariusz Zaborski ATF_TP_ADD_TCS(tp)
758faaf43b2SMariusz Zaborski {
759faaf43b2SMariusz Zaborski 
760faaf43b2SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__open_create);
761faaf43b2SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__open_read);
762faaf43b2SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__open_write);
763faaf43b2SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__open_with_casper);
764faaf43b2SMariusz Zaborski 
765faaf43b2SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__fopen_create);
766faaf43b2SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__fopen_read);
767faaf43b2SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__fopen_write);
768faaf43b2SMariusz Zaborski 
769faaf43b2SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__lstat);
770faaf43b2SMariusz Zaborski 
771dcdad299SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__realpath);
772dcdad299SMariusz Zaborski 
773faaf43b2SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__open_lstat);
774dcdad299SMariusz Zaborski 	ATF_TP_ADD_TC(tp, fileargs__open_realpath);
775faaf43b2SMariusz Zaborski 
776faaf43b2SMariusz Zaborski 	return (atf_no_error());
777faaf43b2SMariusz Zaborski }
778