Path: blob/main/lib/libcasper/services/cap_fileargs/tests/fileargs_test.c
48375 views
/*-1* Copyright (c) 2021 Mariusz Zaborski <[email protected]>2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6* 1. Redistributions of source code must retain the above copyright7* notice, this list of conditions and the following disclaimer.8* 2. Redistributions in binary form must reproduce the above copyright9* notice, this list of conditions and the following disclaimer in the10* documentation and/or other materials provided with the distribution.11*12* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS13* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED14* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR15* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS16* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR17* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF18* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS19* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN20* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)21* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE22* POSSIBILITY OF SUCH DAMAGE.23*/2425#include <sys/param.h>26#include <sys/capsicum.h>27#include <sys/stat.h>2829#include <errno.h>30#include <fcntl.h>31#include <stdio.h>3233#include <atf-c.h>3435#include <libcasper.h>36#include <casper/cap_fileargs.h>3738#include "freebsd_test_suite/macros.h"3940#define MAX_FILES 2004142static char *files[MAX_FILES];43static int fds[MAX_FILES];4445#define TEST_FILE "/etc/passwd"4647static void48check_capsicum(void)49{50ATF_REQUIRE_FEATURE("security_capabilities");51ATF_REQUIRE_FEATURE("security_capability_mode");52}5354static void55prepare_files(size_t num, bool create)56{57const char template[] = "testsfiles.XXXXXXXX";58size_t i;5960for (i = 0; i < num; i++) {61files[i] = calloc(1, sizeof(template));62ATF_REQUIRE(files[i] != NULL);63strncpy(files[i], template, sizeof(template) - 1);6465if (create) {66fds[i] = mkstemp(files[i]);67ATF_REQUIRE(fds[i] >= 0);68} else {69fds[i] = -1;70ATF_REQUIRE(mktemp(files[i]) != NULL);71}72}73}7475static void76clear_files(void)77{78size_t i;798081for (i = 0; files[i] != NULL; i++) {82unlink(files[i]);83free(files[i]);84if (fds[i] != -1)85close(fds[i]);86}87}8889static int90test_file_open(fileargs_t *fa, const char *file, int *fdp)91{92int fd;9394fd = fileargs_open(fa, file);95if (fd < 0)96return (errno);9798if (fdp != NULL) {99*fdp = fd;100}101102return (0);103}104105static int106test_file_fopen(fileargs_t *fa, const char *file, const char *mode,107FILE **retfile)108{109FILE *pfile;110111pfile = fileargs_fopen(fa, file, mode);112if (pfile == NULL)113return (errno);114115if (retfile != NULL) {116*retfile = pfile;117}118119return (0);120}121122static int123test_file_lstat(fileargs_t *fa, const char *file)124{125struct stat fasb, origsb;126bool equals;127128if (fileargs_lstat(fa, file, &fasb) < 0)129return (errno);130131ATF_REQUIRE(lstat(file, &origsb) == 0);132133equals = true;134equals &= (origsb.st_dev == fasb.st_dev);135equals &= (origsb.st_ino == fasb.st_ino);136equals &= (origsb.st_nlink == fasb.st_nlink);137equals &= (origsb.st_flags == fasb.st_flags);138equals &= (memcmp(&origsb.st_ctim, &fasb.st_ctim,139sizeof(fasb.st_ctim)) == 0);140equals &= (memcmp(&origsb.st_birthtim, &fasb.st_birthtim,141sizeof(fasb.st_birthtim)) == 0);142if (!equals) {143return (EINVAL);144}145146return (0);147}148149static int150test_file_realpath_static(fileargs_t *fa, const char *file)151{152char fapath[PATH_MAX], origpath[PATH_MAX];153154if (fileargs_realpath(fa, file, fapath) == NULL)155return (errno);156157ATF_REQUIRE(realpath(file, origpath) != NULL);158159if (strcmp(fapath, origpath) != 0)160return (EINVAL);161162return (0);163}164165static int166test_file_realpath_alloc(fileargs_t *fa, const char *file)167{168char *fapath, *origpath;169int serrno;170171fapath = fileargs_realpath(fa, file, NULL);172if (fapath == NULL)173return (errno);174175origpath = realpath(file, NULL);176ATF_REQUIRE(origpath != NULL);177178serrno = 0;179if (strcmp(fapath, origpath) != 0)180serrno = EINVAL;181182free(fapath);183free(origpath);184185return (serrno);186}187188static int189test_file_realpath(fileargs_t *fa, const char *file)190{191int serrno;192193serrno = test_file_realpath_static(fa, file);194if (serrno != 0)195return serrno;196197return (test_file_realpath_alloc(fa, file));198}199200static int201test_file_mode(int fd, int mode)202{203int flags;204205flags = fcntl(fd, F_GETFL, 0);206if (flags < 0)207return (errno);208209if ((flags & O_ACCMODE) != mode)210return (errno);211212return (0);213}214215static bool216test_file_cap(int fd, cap_rights_t *rights)217{218cap_rights_t fdrights;219220ATF_REQUIRE(cap_rights_get(fd, &fdrights) == 0);221222return (cap_rights_contains(&fdrights, rights));223}224225static int226test_file_write(int fd)227{228char buf;229230buf = 't';231if (write(fd, &buf, sizeof(buf)) != sizeof(buf)) {232return (errno);233}234235return (0);236}237238static int239test_file_read(int fd)240{241char buf;242243if (read(fd, &buf, sizeof(buf)) < 0) {244return (errno);245}246247return (0);248}249250static int251test_file_fwrite(FILE *pfile)252{253char buf;254255buf = 't';256if (fwrite(&buf, sizeof(buf), 1, pfile) != sizeof(buf))257return (errno);258259return (0);260}261262static int263test_file_fread(FILE *pfile)264{265char buf;266int ret, serrno;267268errno = 0;269ret = fread(&buf, sizeof(buf), 1, pfile);270serrno = errno;271if (ret < 0) {272return (serrno);273} else if (ret == 0 && feof(pfile) == 0) {274return (serrno != 0 ? serrno : EINVAL);275}276277return (0);278}279280ATF_TC_WITH_CLEANUP(fileargs__open_read);281ATF_TC_HEAD(fileargs__open_read, tc) {}282ATF_TC_BODY(fileargs__open_read, tc)283{284cap_rights_t rights, norights;285fileargs_t *fa;286size_t i;287int fd;288289check_capsicum();290291prepare_files(MAX_FILES, true);292293cap_rights_init(&rights, CAP_READ, CAP_FCNTL);294cap_rights_init(&norights, CAP_WRITE);295fa = fileargs_init(MAX_FILES, files, O_RDONLY, 0, &rights,296FA_OPEN);297ATF_REQUIRE(fa != NULL);298299for (i = 0; i < MAX_FILES; i++) {300/* ALLOWED */301/* We open file twice to check if we can. */302ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);303ATF_REQUIRE(close(fd) == 0);304305ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);306ATF_REQUIRE(test_file_mode(fd, O_RDONLY) == 0);307ATF_REQUIRE(test_file_cap(fd, &rights) == true);308ATF_REQUIRE(test_file_read(fd) == 0);309310/* DISALLOWED */311ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);312ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);313ATF_REQUIRE(test_file_cap(fd, &norights) == false);314ATF_REQUIRE(test_file_write(fd) == ENOTCAPABLE);315ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);316ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);317318/* CLOSE */319ATF_REQUIRE(close(fd) == 0);320}321}322ATF_TC_CLEANUP(fileargs__open_read, tc)323{324clear_files();325}326327ATF_TC_WITH_CLEANUP(fileargs__open_write);328ATF_TC_HEAD(fileargs__open_write, tc) {}329ATF_TC_BODY(fileargs__open_write, tc)330{331cap_rights_t rights, norights;332fileargs_t *fa;333size_t i;334int fd;335336check_capsicum();337338prepare_files(MAX_FILES, true);339340cap_rights_init(&rights, CAP_WRITE, CAP_FCNTL);341cap_rights_init(&norights, CAP_READ);342fa = fileargs_init(MAX_FILES, files, O_WRONLY, 0, &rights,343FA_OPEN);344ATF_REQUIRE(fa != NULL);345346for (i = 0; i < MAX_FILES; i++) {347/* ALLOWED */348/* We open file twice to check if we can. */349ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);350ATF_REQUIRE(close(fd) == 0);351352ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);353ATF_REQUIRE(test_file_mode(fd, O_WRONLY) == 0);354ATF_REQUIRE(test_file_cap(fd, &rights) == true);355ATF_REQUIRE(test_file_write(fd) == 0);356357/* DISALLOWED */358ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);359ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);360ATF_REQUIRE(test_file_cap(fd, &norights) == false);361ATF_REQUIRE(test_file_read(fd) == ENOTCAPABLE);362ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);363ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);364365/* CLOSE */366ATF_REQUIRE(close(fd) == 0);367}368}369ATF_TC_CLEANUP(fileargs__open_write, tc)370{371clear_files();372}373374ATF_TC_WITH_CLEANUP(fileargs__open_create);375ATF_TC_HEAD(fileargs__open_create, tc) {}376ATF_TC_BODY(fileargs__open_create, tc)377{378cap_rights_t rights, norights;379fileargs_t *fa;380size_t i;381int fd;382383check_capsicum();384385prepare_files(MAX_FILES, false);386387cap_rights_init(&rights, CAP_WRITE, CAP_FCNTL, CAP_READ);388cap_rights_init(&norights, CAP_FCHMOD);389fa = fileargs_init(MAX_FILES, files, O_RDWR | O_CREAT, 666,390&rights, FA_OPEN);391ATF_REQUIRE(fa != NULL);392393for (i = 0; i < MAX_FILES; i++) {394/* ALLOWED */395ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);396397ATF_REQUIRE(test_file_mode(fd, O_RDWR) == 0);398ATF_REQUIRE(test_file_cap(fd, &rights) == true);399ATF_REQUIRE(test_file_write(fd) == 0);400ATF_REQUIRE(test_file_read(fd) == 0);401402/* DISALLOWED */403ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);404ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);405ATF_REQUIRE(test_file_cap(fd, &norights) == false);406ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);407ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);408409/* CLOSE */410ATF_REQUIRE(close(fd) == 0);411}412}413ATF_TC_CLEANUP(fileargs__open_create, tc)414{415clear_files();416}417418ATF_TC_WITH_CLEANUP(fileargs__open_with_casper);419ATF_TC_HEAD(fileargs__open_with_casper, tc) {}420ATF_TC_BODY(fileargs__open_with_casper, tc)421{422cap_channel_t *capcas;423cap_rights_t rights;424fileargs_t *fa;425size_t i;426int fd;427428check_capsicum();429430prepare_files(MAX_FILES, true);431432capcas = cap_init();433ATF_REQUIRE(capcas != NULL);434435cap_rights_init(&rights, CAP_READ);436fa = fileargs_cinit(capcas, MAX_FILES, files, O_RDONLY, 0, &rights,437FA_OPEN);438ATF_REQUIRE(fa != NULL);439440for (i = 0; i < MAX_FILES; i++) {441/* ALLOWED */442ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);443ATF_REQUIRE(test_file_read(fd) == 0);444445/* CLOSE */446ATF_REQUIRE(close(fd) == 0);447}448}449ATF_TC_CLEANUP(fileargs__open_with_casper, tc)450{451clear_files();452}453454ATF_TC_WITH_CLEANUP(fileargs__fopen_read);455ATF_TC_HEAD(fileargs__fopen_read, tc) {}456ATF_TC_BODY(fileargs__fopen_read, tc)457{458cap_rights_t rights, norights;459fileargs_t *fa;460size_t i;461FILE *pfile;462int fd;463464check_capsicum();465466prepare_files(MAX_FILES, true);467468cap_rights_init(&rights, CAP_READ, CAP_FCNTL);469cap_rights_init(&norights, CAP_WRITE);470fa = fileargs_init(MAX_FILES, files, O_RDONLY, 0, &rights,471FA_OPEN);472ATF_REQUIRE(fa != NULL);473474for (i = 0; i < MAX_FILES; i++) {475/* ALLOWED */476/* We fopen file twice to check if we can. */477ATF_REQUIRE(test_file_fopen(fa, files[i], "r", &pfile) == 0);478ATF_REQUIRE(fclose(pfile) == 0);479480ATF_REQUIRE(test_file_fopen(fa, files[i], "r", &pfile) == 0);481fd = fileno(pfile);482ATF_REQUIRE(test_file_mode(fd, O_RDONLY) == 0);483ATF_REQUIRE(test_file_cap(fd, &rights) == true);484ATF_REQUIRE(test_file_fread(pfile) == 0);485486/* DISALLOWED */487ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);488ATF_REQUIRE(test_file_fopen(fa, TEST_FILE, "r", NULL) ==489ENOTCAPABLE);490ATF_REQUIRE(test_file_cap(fd, &norights) == false);491ATF_REQUIRE(test_file_fwrite(pfile) == EBADF);492ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);493ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);494495/* CLOSE */496ATF_REQUIRE(fclose(pfile) == 0);497}498}499ATF_TC_CLEANUP(fileargs__fopen_read, tc)500{501clear_files();502}503504ATF_TC_WITH_CLEANUP(fileargs__fopen_write);505ATF_TC_HEAD(fileargs__fopen_write, tc) {}506ATF_TC_BODY(fileargs__fopen_write, tc)507{508cap_rights_t rights, norights;509fileargs_t *fa;510size_t i;511FILE *pfile;512int fd;513514check_capsicum();515516prepare_files(MAX_FILES, true);517518cap_rights_init(&rights, CAP_WRITE, CAP_FCNTL);519cap_rights_init(&norights, CAP_READ);520fa = fileargs_init(MAX_FILES, files, O_WRONLY, 0, &rights,521FA_OPEN);522ATF_REQUIRE(fa != NULL);523524for (i = 0; i < MAX_FILES; i++) {525/* ALLOWED */526/* We fopen file twice to check if we can. */527ATF_REQUIRE(test_file_fopen(fa, files[i], "w", &pfile) == 0);528ATF_REQUIRE(fclose(pfile) == 0);529530ATF_REQUIRE(test_file_fopen(fa, files[i], "w", &pfile) == 0);531fd = fileno(pfile);532ATF_REQUIRE(test_file_mode(fd, O_WRONLY) == 0);533ATF_REQUIRE(test_file_cap(fd, &rights) == true);534ATF_REQUIRE(test_file_fwrite(pfile) == 0);535536/* DISALLOWED */537ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);538ATF_REQUIRE(test_file_fopen(fa, TEST_FILE, "w", NULL) ==539ENOTCAPABLE);540ATF_REQUIRE(test_file_cap(fd, &norights) == false);541ATF_REQUIRE(test_file_fread(pfile) == EBADF);542ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);543ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);544545/* CLOSE */546ATF_REQUIRE(fclose(pfile) == 0);547}548}549ATF_TC_CLEANUP(fileargs__fopen_write, tc)550{551clear_files();552}553554ATF_TC_WITH_CLEANUP(fileargs__fopen_create);555ATF_TC_HEAD(fileargs__fopen_create, tc) {}556ATF_TC_BODY(fileargs__fopen_create, tc)557{558cap_rights_t rights;559fileargs_t *fa;560size_t i;561FILE *pfile;562int fd;563564check_capsicum();565566prepare_files(MAX_FILES, false);567568cap_rights_init(&rights, CAP_READ, CAP_WRITE, CAP_FCNTL);569fa = fileargs_init(MAX_FILES, files, O_RDWR | O_CREAT, 0, &rights,570FA_OPEN);571ATF_REQUIRE(fa != NULL);572573for (i = 0; i < MAX_FILES; i++) {574/* ALLOWED */575/* We fopen file twice to check if we can. */576ATF_REQUIRE(test_file_fopen(fa, files[i], "w+", &pfile) == 0);577fd = fileno(pfile);578ATF_REQUIRE(test_file_mode(fd, O_RDWR) == 0);579ATF_REQUIRE(test_file_cap(fd, &rights) == true);580ATF_REQUIRE(test_file_fwrite(pfile) == 0);581ATF_REQUIRE(test_file_fread(pfile) == 0);582583/* DISALLOWED */584ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);585ATF_REQUIRE(test_file_fopen(fa, TEST_FILE, "w+", NULL) ==586ENOTCAPABLE);587ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);588ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);589590/* CLOSE */591ATF_REQUIRE(fclose(pfile) == 0);592}593}594ATF_TC_CLEANUP(fileargs__fopen_create, tc)595{596clear_files();597}598599ATF_TC_WITH_CLEANUP(fileargs__lstat);600ATF_TC_HEAD(fileargs__lstat, tc) {}601ATF_TC_BODY(fileargs__lstat, tc)602{603fileargs_t *fa;604size_t i;605int fd;606607check_capsicum();608609prepare_files(MAX_FILES, true);610611fa = fileargs_init(MAX_FILES, files, 0, 0, NULL, FA_LSTAT);612ATF_REQUIRE(fa != NULL);613614for (i = 0; i < MAX_FILES; i++) {615/* ALLOWED */616ATF_REQUIRE(test_file_lstat(fa, files[i]) == 0);617618/* DISALLOWED */619ATF_REQUIRE(test_file_open(fa, files[i], &fd) == ENOTCAPABLE);620ATF_REQUIRE(test_file_lstat(fa, TEST_FILE) == ENOTCAPABLE);621ATF_REQUIRE(test_file_open(fa, TEST_FILE, &fd) == ENOTCAPABLE);622ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);623ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);624}625}626ATF_TC_CLEANUP(fileargs__lstat, tc)627{628clear_files();629}630631ATF_TC_WITH_CLEANUP(fileargs__realpath);632ATF_TC_HEAD(fileargs__realpath, tc) {}633ATF_TC_BODY(fileargs__realpath, tc)634{635fileargs_t *fa;636size_t i;637int fd;638639prepare_files(MAX_FILES, true);640641fa = fileargs_init(MAX_FILES, files, 0, 0, NULL, FA_REALPATH);642ATF_REQUIRE(fa != NULL);643644for (i = 0; i < MAX_FILES; i++) {645/* ALLOWED */646ATF_REQUIRE(test_file_realpath(fa, files[i]) == 0);647648/* DISALLOWED */649ATF_REQUIRE(test_file_open(fa, files[i], &fd) == ENOTCAPABLE);650ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);651ATF_REQUIRE(test_file_lstat(fa, TEST_FILE) == ENOTCAPABLE);652ATF_REQUIRE(test_file_open(fa, TEST_FILE, &fd) == ENOTCAPABLE);653ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);654}655}656ATF_TC_CLEANUP(fileargs__realpath, tc)657{658clear_files();659}660661ATF_TC_WITH_CLEANUP(fileargs__open_lstat);662ATF_TC_HEAD(fileargs__open_lstat, tc) {}663ATF_TC_BODY(fileargs__open_lstat, tc)664{665cap_rights_t rights, norights;666fileargs_t *fa;667size_t i;668int fd;669670check_capsicum();671672prepare_files(MAX_FILES, true);673674cap_rights_init(&rights, CAP_READ, CAP_FCNTL);675cap_rights_init(&norights, CAP_WRITE);676fa = fileargs_init(MAX_FILES, files, O_RDONLY, 0, &rights,677FA_OPEN | FA_LSTAT);678ATF_REQUIRE(fa != NULL);679680for (i = 0; i < MAX_FILES; i++) {681/* ALLOWED */682/* We open file twice to check if we can. */683ATF_REQUIRE(test_file_lstat(fa, files[i]) == 0);684ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);685ATF_REQUIRE(close(fd) == 0);686687ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);688ATF_REQUIRE(test_file_lstat(fa, files[i]) == 0);689ATF_REQUIRE(test_file_mode(fd, O_RDONLY) == 0);690ATF_REQUIRE(test_file_cap(fd, &rights) == true);691ATF_REQUIRE(test_file_read(fd) == 0);692693/* DISALLOWED */694ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);695ATF_REQUIRE(test_file_cap(fd, &norights) == false);696ATF_REQUIRE(test_file_write(fd) == ENOTCAPABLE);697ATF_REQUIRE(test_file_realpath(fa, files[i]) == ENOTCAPABLE);698ATF_REQUIRE(test_file_realpath(fa, TEST_FILE) == ENOTCAPABLE);699700/* CLOSE */701ATF_REQUIRE(close(fd) == 0);702}703}704ATF_TC_CLEANUP(fileargs__open_lstat, tc)705{706clear_files();707}708709ATF_TC_WITH_CLEANUP(fileargs__open_realpath);710ATF_TC_HEAD(fileargs__open_realpath, tc) {}711ATF_TC_BODY(fileargs__open_realpath, tc)712{713cap_rights_t rights, norights;714fileargs_t *fa;715size_t i;716int fd;717718check_capsicum();719720prepare_files(MAX_FILES, true);721722cap_rights_init(&rights, CAP_READ, CAP_FCNTL);723cap_rights_init(&norights, CAP_WRITE);724fa = fileargs_init(MAX_FILES, files, O_RDONLY, 0, &rights,725FA_OPEN | FA_REALPATH);726ATF_REQUIRE(fa != NULL);727728for (i = 0; i < MAX_FILES; i++) {729/* ALLOWED */730/* We open file twice to check if we can. */731ATF_REQUIRE(test_file_realpath(fa, files[i]) == 0);732ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);733ATF_REQUIRE(close(fd) == 0);734735ATF_REQUIRE(test_file_open(fa, files[i], &fd) == 0);736ATF_REQUIRE(test_file_realpath(fa, files[i]) == 0);737ATF_REQUIRE(test_file_mode(fd, O_RDONLY) == 0);738ATF_REQUIRE(test_file_cap(fd, &rights) == true);739ATF_REQUIRE(test_file_read(fd) == 0);740741/* DISALLOWED */742ATF_REQUIRE(test_file_open(fa, TEST_FILE, NULL) == ENOTCAPABLE);743ATF_REQUIRE(test_file_cap(fd, &norights) == false);744ATF_REQUIRE(test_file_write(fd) == ENOTCAPABLE);745ATF_REQUIRE(test_file_lstat(fa, files[i]) == ENOTCAPABLE);746747/* CLOSE */748ATF_REQUIRE(close(fd) == 0);749}750}751ATF_TC_CLEANUP(fileargs__open_realpath, tc)752{753clear_files();754}755756ATF_TP_ADD_TCS(tp)757{758759ATF_TP_ADD_TC(tp, fileargs__open_create);760ATF_TP_ADD_TC(tp, fileargs__open_read);761ATF_TP_ADD_TC(tp, fileargs__open_write);762ATF_TP_ADD_TC(tp, fileargs__open_with_casper);763764ATF_TP_ADD_TC(tp, fileargs__fopen_create);765ATF_TP_ADD_TC(tp, fileargs__fopen_read);766ATF_TP_ADD_TC(tp, fileargs__fopen_write);767768ATF_TP_ADD_TC(tp, fileargs__lstat);769770ATF_TP_ADD_TC(tp, fileargs__realpath);771772ATF_TP_ADD_TC(tp, fileargs__open_lstat);773ATF_TP_ADD_TC(tp, fileargs__open_realpath);774775return (atf_no_error());776}777778779