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