Path: blob/main/tests/sys/audit/file-attribute-access.c
39534 views
/*-1* Copyright (c) 2018 Aniket Pandey2*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 AUTHOR AND CONTRIBUTORS ``AS IS'' AND13* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE14* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE15* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE16* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL17* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS18* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF19* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)20* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT21* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY22* SUCH DAMAGE.23*/2425#include <sys/param.h>26#include <sys/extattr.h>27#include <sys/mount.h>28#include <sys/stat.h>29#include <sys/syscall.h>30#include <sys/ucred.h>3132#include <atf-c.h>33#include <errno.h>34#include <fcntl.h>35#include <string.h>36#include <unistd.h>3738#include "utils.h"3940static struct pollfd fds[1];41static mode_t mode = 0777;42static pid_t pid;43static fhandle_t fht;44static int filedesc, fhdesc;45static char extregex[80];46static char buff[] = "ezio";47static struct stat statbuff;48static struct statfs statfsbuff;49static const char *auclass = "fa";50static const char *name = "authorname";51static const char *path = "fileforaudit";52static const char *errpath = "dirdoesnotexist/fileforaudit";53static const char *successreg = "fileforaudit.*return,success";54static const char *failurereg = "fileforaudit.*return,failure";555657ATF_TC_WITH_CLEANUP(stat_success);58ATF_TC_HEAD(stat_success, tc)59{60atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "61"stat(2) call");62}6364ATF_TC_BODY(stat_success, tc)65{66/* File needs to exist to call stat(2) */67ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);68FILE *pipefd = setup(fds, auclass);69ATF_REQUIRE_EQ(0, stat(path, &statbuff));70check_audit(fds, successreg, pipefd);71close(filedesc);72}7374ATF_TC_CLEANUP(stat_success, tc)75{76cleanup();77}787980ATF_TC_WITH_CLEANUP(stat_failure);81ATF_TC_HEAD(stat_failure, tc)82{83atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "84"stat(2) call");85}8687ATF_TC_BODY(stat_failure, tc)88{89FILE *pipefd = setup(fds, auclass);90/* Failure reason: file does not exist */91ATF_REQUIRE_ERRNO(ENOENT, stat(errpath, &statbuff) == -1);92check_audit(fds, failurereg, pipefd);93}9495ATF_TC_CLEANUP(stat_failure, tc)96{97cleanup();98}99100101ATF_TC_WITH_CLEANUP(lstat_success);102ATF_TC_HEAD(lstat_success, tc)103{104atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "105"lstat(2) call");106}107108ATF_TC_BODY(lstat_success, tc)109{110/* Symbolic link needs to exist to call lstat(2) */111ATF_REQUIRE_EQ(0, symlink("symlink", path));112FILE *pipefd = setup(fds, auclass);113ATF_REQUIRE_EQ(0, lstat(path, &statbuff));114check_audit(fds, successreg, pipefd);115}116117ATF_TC_CLEANUP(lstat_success, tc)118{119cleanup();120}121122123ATF_TC_WITH_CLEANUP(lstat_failure);124ATF_TC_HEAD(lstat_failure, tc)125{126atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "127"lstat(2) call");128}129130ATF_TC_BODY(lstat_failure, tc)131{132FILE *pipefd = setup(fds, auclass);133/* Failure reason: symbolic link does not exist */134ATF_REQUIRE_ERRNO(ENOENT, lstat(errpath, &statbuff) == -1);135check_audit(fds, failurereg, pipefd);136}137138ATF_TC_CLEANUP(lstat_failure, tc)139{140cleanup();141}142143144ATF_TC_WITH_CLEANUP(fstat_success);145ATF_TC_HEAD(fstat_success, tc)146{147atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "148"fstat(2) call");149}150151ATF_TC_BODY(fstat_success, tc)152{153/* File needs to exist to call fstat(2) */154ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);155FILE *pipefd = setup(fds, auclass);156ATF_REQUIRE_EQ(0, fstat(filedesc, &statbuff));157158snprintf(extregex, sizeof(extregex),159"fstat.*%jd.*return,success", (intmax_t)statbuff.st_ino);160check_audit(fds, extregex, pipefd);161close(filedesc);162}163164ATF_TC_CLEANUP(fstat_success, tc)165{166cleanup();167}168169170ATF_TC_WITH_CLEANUP(fstat_failure);171ATF_TC_HEAD(fstat_failure, tc)172{173atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "174"fstat(2) call");175}176177ATF_TC_BODY(fstat_failure, tc)178{179FILE *pipefd = setup(fds, auclass);180const char *regex = "fstat.*return,failure : Bad file descriptor";181/* Failure reason: bad file descriptor */182ATF_REQUIRE_ERRNO(EBADF, fstat(-1, &statbuff) == -1);183check_audit(fds, regex, pipefd);184}185186ATF_TC_CLEANUP(fstat_failure, tc)187{188cleanup();189}190191192ATF_TC_WITH_CLEANUP(fstatat_success);193ATF_TC_HEAD(fstatat_success, tc)194{195atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "196"fstatat(2) call");197}198199ATF_TC_BODY(fstatat_success, tc)200{201/* File or Symbolic link needs to exist to call lstat(2) */202ATF_REQUIRE_EQ(0, symlink("symlink", path));203FILE *pipefd = setup(fds, auclass);204ATF_REQUIRE_EQ(0, fstatat(AT_FDCWD, path, &statbuff,205AT_SYMLINK_NOFOLLOW));206check_audit(fds, successreg, pipefd);207}208209ATF_TC_CLEANUP(fstatat_success, tc)210{211cleanup();212}213214215ATF_TC_WITH_CLEANUP(fstatat_failure);216ATF_TC_HEAD(fstatat_failure, tc)217{218atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "219"fstatat(2) call");220}221222ATF_TC_BODY(fstatat_failure, tc)223{224FILE *pipefd = setup(fds, auclass);225/* Failure reason: symbolic link does not exist */226ATF_REQUIRE_ERRNO(ENOENT,227fstatat(AT_FDCWD, path, &statbuff, AT_SYMLINK_NOFOLLOW) == -1);228check_audit(fds, failurereg, pipefd);229}230231ATF_TC_CLEANUP(fstatat_failure, tc)232{233cleanup();234}235236237ATF_TC_WITH_CLEANUP(statfs_success);238ATF_TC_HEAD(statfs_success, tc)239{240atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "241"statfs(2) call");242}243244ATF_TC_BODY(statfs_success, tc)245{246/* File needs to exist to call statfs(2) */247ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);248FILE *pipefd = setup(fds, auclass);249ATF_REQUIRE_EQ(0, statfs(path, &statfsbuff));250check_audit(fds, successreg, pipefd);251close(filedesc);252}253254ATF_TC_CLEANUP(statfs_success, tc)255{256cleanup();257}258259260ATF_TC_WITH_CLEANUP(statfs_failure);261ATF_TC_HEAD(statfs_failure, tc)262{263atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "264"statfs(2) call");265}266267ATF_TC_BODY(statfs_failure, tc)268{269FILE *pipefd = setup(fds, auclass);270/* Failure reason: file does not exist */271ATF_REQUIRE_ERRNO(ENOENT, statfs(errpath, &statfsbuff) == -1);272check_audit(fds, failurereg, pipefd);273}274275ATF_TC_CLEANUP(statfs_failure, tc)276{277cleanup();278}279280281ATF_TC_WITH_CLEANUP(fstatfs_success);282ATF_TC_HEAD(fstatfs_success, tc)283{284atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "285"fstatfs(2) call");286}287288ATF_TC_BODY(fstatfs_success, tc)289{290/* File needs to exist to call fstat(2) */291ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);292/* Call stat(2) to store the Inode number of 'path' */293ATF_REQUIRE_EQ(0, stat(path, &statbuff));294FILE *pipefd = setup(fds, auclass);295ATF_REQUIRE_EQ(0, fstatfs(filedesc, &statfsbuff));296297snprintf(extregex, sizeof(extregex), "fstatfs.*%jd.*return,success",298(intmax_t)statbuff.st_ino);299check_audit(fds, extregex, pipefd);300close(filedesc);301}302303ATF_TC_CLEANUP(fstatfs_success, tc)304{305cleanup();306}307308309ATF_TC_WITH_CLEANUP(fstatfs_failure);310ATF_TC_HEAD(fstatfs_failure, tc)311{312atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "313"fstatfs(2) call");314}315316ATF_TC_BODY(fstatfs_failure, tc)317{318FILE *pipefd = setup(fds, auclass);319const char *regex = "fstatfs.*return,failure : Bad file descriptor";320/* Failure reason: bad file descriptor */321ATF_REQUIRE_ERRNO(EBADF, fstatfs(-1, &statfsbuff) == -1);322check_audit(fds, regex, pipefd);323}324325ATF_TC_CLEANUP(fstatfs_failure, tc)326{327cleanup();328}329330331ATF_TC_WITH_CLEANUP(getfsstat_success);332ATF_TC_HEAD(getfsstat_success, tc)333{334atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "335"getfsstat(2) call");336}337338ATF_TC_BODY(getfsstat_success, tc)339{340pid = getpid();341snprintf(extregex, sizeof(extregex), "getfsstat.*%d.*success", pid);342343FILE *pipefd = setup(fds, auclass);344ATF_REQUIRE(getfsstat(NULL, 0, MNT_NOWAIT) != -1);345check_audit(fds, extregex, pipefd);346}347348ATF_TC_CLEANUP(getfsstat_success, tc)349{350cleanup();351}352353354ATF_TC_WITH_CLEANUP(getfsstat_failure);355ATF_TC_HEAD(getfsstat_failure, tc)356{357atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "358"getfsstat(2) call");359}360361ATF_TC_BODY(getfsstat_failure, tc)362{363const char *regex = "getfsstat.*return,failure : Invalid argument";364FILE *pipefd = setup(fds, auclass);365/* Failure reason: Invalid value for mode */366ATF_REQUIRE_ERRNO(EINVAL, getfsstat(NULL, 0, -1) == -1);367check_audit(fds, regex, pipefd);368}369370ATF_TC_CLEANUP(getfsstat_failure, tc)371{372cleanup();373}374375376ATF_TC_WITH_CLEANUP(lgetfh_success);377ATF_TC_HEAD(lgetfh_success, tc)378{379atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "380"lgetfh(2) call");381}382383ATF_TC_BODY(lgetfh_success, tc)384{385/* Symbolic link needs to exist to get a file-handle */386ATF_REQUIRE_EQ(0, symlink("symlink", path));387const char *regex = "lgetfh.*return,success";388FILE *pipefd = setup(fds, "fa");389ATF_REQUIRE_EQ(0, lgetfh(path, &fht));390check_audit(fds, regex, pipefd);391}392393ATF_TC_CLEANUP(lgetfh_success, tc)394{395cleanup();396}397398399ATF_TC_WITH_CLEANUP(lgetfh_failure);400ATF_TC_HEAD(lgetfh_failure, tc)401{402atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "403"lgetfh(2) call");404}405406ATF_TC_BODY(lgetfh_failure, tc)407{408const char *regex = "lgetfh.*return,failure";409FILE *pipefd = setup(fds, "fa");410/* Failure reason: symbolic link does not exist */411ATF_REQUIRE_ERRNO(ENOENT, lgetfh(errpath, &fht) == -1);412check_audit(fds, regex, pipefd);413}414415ATF_TC_CLEANUP(lgetfh_failure, tc)416{417cleanup();418}419420421ATF_TC_WITH_CLEANUP(fhopen_success);422ATF_TC_HEAD(fhopen_success, tc)423{424atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "425"fhopen(2) call");426}427428ATF_TC_BODY(fhopen_success, tc)429{430pid = getpid();431snprintf(extregex, sizeof(extregex), "fhopen.*%d.*return,success", pid);432433/* File needs to exist to get a file-handle */434ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);435/* Get the file handle to be passed to fhopen(2) */436ATF_REQUIRE_EQ(0, getfh(path, &fht));437438FILE *pipefd = setup(fds, auclass);439ATF_REQUIRE((fhdesc = fhopen(&fht, O_RDWR)) != -1);440check_audit(fds, extregex, pipefd);441442close(fhdesc);443close(filedesc);444}445446ATF_TC_CLEANUP(fhopen_success, tc)447{448cleanup();449}450451452ATF_TC_WITH_CLEANUP(fhopen_failure);453ATF_TC_HEAD(fhopen_failure, tc)454{455atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "456"fhopen(2) call");457}458459ATF_TC_BODY(fhopen_failure, tc)460{461const char *regex = "fhopen.*return,failure : Invalid argument";462FILE *pipefd = setup(fds, auclass);463/*464* Failure reason: NULL does not represent any file handle465* and O_CREAT is not allowed as the flag for fhopen(2)466*/467ATF_REQUIRE_ERRNO(EINVAL, fhopen(NULL, O_CREAT) == -1);468check_audit(fds, regex, pipefd);469}470471ATF_TC_CLEANUP(fhopen_failure, tc)472{473cleanup();474}475476477ATF_TC_WITH_CLEANUP(fhstat_success);478ATF_TC_HEAD(fhstat_success, tc)479{480atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "481"fstat(2) call");482}483484ATF_TC_BODY(fhstat_success, tc)485{486pid = getpid();487snprintf(extregex, sizeof(extregex), "fhstat.*%d.*return,success", pid);488489/* File needs to exist to get a file-handle */490ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);491/* Get the file handle to be passed to fhstat(2) */492ATF_REQUIRE_EQ(0, getfh(path, &fht));493494FILE *pipefd = setup(fds, auclass);495ATF_REQUIRE_EQ(0, fhstat(&fht, &statbuff));496check_audit(fds, extregex, pipefd);497close(filedesc);498}499500ATF_TC_CLEANUP(fhstat_success, tc)501{502cleanup();503}504505506ATF_TC_WITH_CLEANUP(fhstat_failure);507ATF_TC_HEAD(fhstat_failure, tc)508{509atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "510"fhstat(2) call");511}512513ATF_TC_BODY(fhstat_failure, tc)514{515const char *regex = "fhstat.*return,failure : Bad address";516FILE *pipefd = setup(fds, auclass);517/* Failure reason: NULL does not represent any file handle */518ATF_REQUIRE_ERRNO(EFAULT, fhstat(NULL, NULL) == -1);519check_audit(fds, regex, pipefd);520}521522ATF_TC_CLEANUP(fhstat_failure, tc)523{524cleanup();525}526527528ATF_TC_WITH_CLEANUP(fhstatfs_success);529ATF_TC_HEAD(fhstatfs_success, tc)530{531atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "532"fstatfs(2) call");533}534535ATF_TC_BODY(fhstatfs_success, tc)536{537pid = getpid();538snprintf(extregex, sizeof(extregex), "fhstatfs.*%d.*success", pid);539540/* File needs to exist to get a file-handle */541ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);542/* Get the file handle to be passed to fhstatfs(2) */543ATF_REQUIRE_EQ(0, getfh(path, &fht));544545FILE *pipefd = setup(fds, auclass);546ATF_REQUIRE_EQ(0, fhstatfs(&fht, &statfsbuff));547check_audit(fds, extregex, pipefd);548close(filedesc);549}550551ATF_TC_CLEANUP(fhstatfs_success, tc)552{553cleanup();554}555556557ATF_TC_WITH_CLEANUP(fhstatfs_failure);558ATF_TC_HEAD(fhstatfs_failure, tc)559{560atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "561"fhstatfs(2) call");562}563564ATF_TC_BODY(fhstatfs_failure, tc)565{566const char *regex = "fhstatfs.*return,failure : Bad address";567FILE *pipefd = setup(fds, auclass);568/* Failure reason: NULL does not represent any file handle */569ATF_REQUIRE_ERRNO(EFAULT, fhstatfs(NULL, NULL) == -1);570check_audit(fds, regex, pipefd);571}572573ATF_TC_CLEANUP(fhstatfs_failure, tc)574{575cleanup();576}577578579ATF_TC_WITH_CLEANUP(access_success);580ATF_TC_HEAD(access_success, tc)581{582atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "583"access(2) call");584}585586ATF_TC_BODY(access_success, tc)587{588/* File needs to exist to call access(2) */589ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);590FILE *pipefd = setup(fds, auclass);591ATF_REQUIRE_EQ(0, access(path, F_OK));592check_audit(fds, successreg, pipefd);593close(filedesc);594}595596ATF_TC_CLEANUP(access_success, tc)597{598cleanup();599}600601602ATF_TC_WITH_CLEANUP(access_failure);603ATF_TC_HEAD(access_failure, tc)604{605atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "606"access(2) call");607}608609ATF_TC_BODY(access_failure, tc)610{611FILE *pipefd = setup(fds, auclass);612/* Failure reason: file does not exist */613ATF_REQUIRE_ERRNO(ENOENT, access(errpath, F_OK) == -1);614check_audit(fds, failurereg, pipefd);615}616617ATF_TC_CLEANUP(access_failure, tc)618{619cleanup();620}621622623ATF_TC_WITH_CLEANUP(eaccess_success);624ATF_TC_HEAD(eaccess_success, tc)625{626atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "627"eaccess(2) call");628}629630ATF_TC_BODY(eaccess_success, tc)631{632/* File needs to exist to call eaccess(2) */633ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);634FILE *pipefd = setup(fds, auclass);635ATF_REQUIRE_EQ(0, eaccess(path, F_OK));636check_audit(fds, successreg, pipefd);637close(filedesc);638}639640ATF_TC_CLEANUP(eaccess_success, tc)641{642cleanup();643}644645646ATF_TC_WITH_CLEANUP(eaccess_failure);647ATF_TC_HEAD(eaccess_failure, tc)648{649atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "650"eaccess(2) call");651}652653ATF_TC_BODY(eaccess_failure, tc)654{655FILE *pipefd = setup(fds, auclass);656/* Failure reason: file does not exist */657ATF_REQUIRE_ERRNO(ENOENT, eaccess(errpath, F_OK) == -1);658check_audit(fds, failurereg, pipefd);659}660661ATF_TC_CLEANUP(eaccess_failure, tc)662{663cleanup();664}665666667ATF_TC_WITH_CLEANUP(faccessat_success);668ATF_TC_HEAD(faccessat_success, tc)669{670atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "671"faccessat(2) call");672}673674ATF_TC_BODY(faccessat_success, tc)675{676/* File needs to exist to call faccessat(2) */677ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);678FILE *pipefd = setup(fds, auclass);679ATF_REQUIRE_EQ(0, faccessat(AT_FDCWD, path, F_OK, AT_EACCESS));680check_audit(fds, successreg, pipefd);681close(filedesc);682}683684ATF_TC_CLEANUP(faccessat_success, tc)685{686cleanup();687}688689690ATF_TC_WITH_CLEANUP(faccessat_failure);691ATF_TC_HEAD(faccessat_failure, tc)692{693atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "694"faccessat(2) call");695}696697ATF_TC_BODY(faccessat_failure, tc)698{699FILE *pipefd = setup(fds, auclass);700/* Failure reason: file does not exist */701ATF_REQUIRE_ERRNO(ENOENT,702faccessat(AT_FDCWD, errpath, F_OK, AT_EACCESS) == -1);703check_audit(fds, failurereg, pipefd);704}705706ATF_TC_CLEANUP(faccessat_failure, tc)707{708cleanup();709}710711712ATF_TC_WITH_CLEANUP(pathconf_success);713ATF_TC_HEAD(pathconf_success, tc)714{715atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "716"pathconf(2) call");717}718719ATF_TC_BODY(pathconf_success, tc)720{721/* File needs to exist to call pathconf(2) */722ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);723FILE *pipefd = setup(fds, auclass);724/* Get the maximum number of bytes of filename */725ATF_REQUIRE(pathconf(path, _PC_NAME_MAX) != -1);726check_audit(fds, successreg, pipefd);727close(filedesc);728}729730ATF_TC_CLEANUP(pathconf_success, tc)731{732cleanup();733}734735736ATF_TC_WITH_CLEANUP(pathconf_failure);737ATF_TC_HEAD(pathconf_failure, tc)738{739atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "740"pathconf(2) call");741}742743ATF_TC_BODY(pathconf_failure, tc)744{745FILE *pipefd = setup(fds, auclass);746/* Failure reason: file does not exist */747ATF_REQUIRE_ERRNO(ENOENT, pathconf(errpath, _PC_NAME_MAX) == -1);748check_audit(fds, failurereg, pipefd);749}750751ATF_TC_CLEANUP(pathconf_failure, tc)752{753cleanup();754}755756757ATF_TC_WITH_CLEANUP(lpathconf_success);758ATF_TC_HEAD(lpathconf_success, tc)759{760atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "761"lpathconf(2) call");762}763764ATF_TC_BODY(lpathconf_success, tc)765{766/* Symbolic link needs to exist to call lpathconf(2) */767ATF_REQUIRE_EQ(0, symlink("symlink", path));768FILE *pipefd = setup(fds, auclass);769/* Get the maximum number of bytes of symlink's name */770ATF_REQUIRE(lpathconf(path, _PC_SYMLINK_MAX) != -1);771check_audit(fds, successreg, pipefd);772}773774ATF_TC_CLEANUP(lpathconf_success, tc)775{776cleanup();777}778779780ATF_TC_WITH_CLEANUP(lpathconf_failure);781ATF_TC_HEAD(lpathconf_failure, tc)782{783atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "784"lpathconf(2) call");785}786787ATF_TC_BODY(lpathconf_failure, tc)788{789FILE *pipefd = setup(fds, auclass);790/* Failure reason: symbolic link does not exist */791ATF_REQUIRE_ERRNO(ENOENT, lpathconf(errpath, _PC_SYMLINK_MAX) == -1);792check_audit(fds, failurereg, pipefd);793}794795ATF_TC_CLEANUP(lpathconf_failure, tc)796{797cleanup();798}799800801ATF_TC_WITH_CLEANUP(fpathconf_success);802ATF_TC_HEAD(fpathconf_success, tc)803{804atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "805"fpathconf(2) call");806}807808ATF_TC_BODY(fpathconf_success, tc)809{810pid = getpid();811snprintf(extregex, sizeof(extregex), "fpathconf.*%d.*success", pid);812813/* File needs to exist to call fpathconf(2) */814ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);815FILE *pipefd = setup(fds, auclass);816/* Get the maximum number of bytes of filename */817ATF_REQUIRE(fpathconf(filedesc, _PC_NAME_MAX) != -1);818check_audit(fds, extregex, pipefd);819close(filedesc);820}821822ATF_TC_CLEANUP(fpathconf_success, tc)823{824cleanup();825}826827828ATF_TC_WITH_CLEANUP(fpathconf_failure);829ATF_TC_HEAD(fpathconf_failure, tc)830{831atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "832"fpathconf(2) call");833}834835ATF_TC_BODY(fpathconf_failure, tc)836{837FILE *pipefd = setup(fds, auclass);838const char *regex = "fpathconf.*return,failure : Bad file descriptor";839/* Failure reason: Bad file descriptor */840ATF_REQUIRE_ERRNO(EBADF, fpathconf(-1, _PC_NAME_MAX) == -1);841check_audit(fds, regex, pipefd);842}843844ATF_TC_CLEANUP(fpathconf_failure, tc)845{846cleanup();847}848849850ATF_TC_WITH_CLEANUP(extattr_get_file_success);851ATF_TC_HEAD(extattr_get_file_success, tc)852{853atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "854"extattr_get_file(2) call");855}856857ATF_TC_BODY(extattr_get_file_success, tc)858{859/* File needs to exist to call extattr_get_file(2) */860ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);861skip_if_extattr_not_supported(path);862863/* Set an extended attribute to be retrieved later on */864REQUIRE_EXTATTR_RESULT(sizeof(buff),865extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, buff,866sizeof(buff)));867868/* Prepare the regex to be checked in the audit record */869snprintf(extregex, sizeof(extregex),870"extattr_get_file.*%s.*%s.*return,success", path, name);871872FILE *pipefd = setup(fds, auclass);873REQUIRE_EXTATTR_RESULT(sizeof(buff),874extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, NULL, 0));875check_audit(fds, extregex, pipefd);876close(filedesc);877}878879ATF_TC_CLEANUP(extattr_get_file_success, tc)880{881cleanup();882}883884885ATF_TC_WITH_CLEANUP(extattr_get_file_failure);886ATF_TC_HEAD(extattr_get_file_failure, tc)887{888atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "889"extattr_get_file(2) call");890}891892ATF_TC_BODY(extattr_get_file_failure, tc)893{894/* Prepare the regex to be checked in the audit record */895snprintf(extregex, sizeof(extregex),896"extattr_get_file.*%s.*%s.*failure", path, name);897898FILE *pipefd = setup(fds, auclass);899/* Failure reason: file does not exist */900ATF_REQUIRE_ERRNO(ENOENT,901extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==902-1);903check_audit(fds, extregex, pipefd);904}905906ATF_TC_CLEANUP(extattr_get_file_failure, tc)907{908cleanup();909}910911912ATF_TC_WITH_CLEANUP(extattr_get_fd_success);913ATF_TC_HEAD(extattr_get_fd_success, tc)914{915atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "916"extattr_get_fd(2) call");917}918919ATF_TC_BODY(extattr_get_fd_success, tc)920{921/* File needs to exist to call extattr_get_fd(2) */922ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);923skip_if_extattr_not_supported(path);924925/* Set an extended attribute to be retrieved later on */926REQUIRE_EXTATTR_RESULT(sizeof(buff),927extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, buff,928sizeof(buff)));929930/* Prepare the regex to be checked in the audit record */931snprintf(extregex, sizeof(extregex),932"extattr_get_fd.*%s.*return,success", name);933934FILE *pipefd = setup(fds, auclass);935REQUIRE_EXTATTR_RESULT(sizeof(buff),936extattr_get_fd(filedesc, EXTATTR_NAMESPACE_USER, name, NULL, 0));937check_audit(fds, extregex, pipefd);938close(filedesc);939}940941ATF_TC_CLEANUP(extattr_get_fd_success, tc)942{943cleanup();944}945946947ATF_TC_WITH_CLEANUP(extattr_get_fd_failure);948ATF_TC_HEAD(extattr_get_fd_failure, tc)949{950atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "951"extattr_get_fd(2) call");952}953954ATF_TC_BODY(extattr_get_fd_failure, tc)955{956/* Prepare the regex to be checked in the audit record */957snprintf(extregex, sizeof(extregex),958"extattr_get_fd.*%s.*return,failure : Bad file descriptor", name);959960FILE *pipefd = setup(fds, auclass);961/* Failure reason: Invalid file descriptor */962ATF_REQUIRE_ERRNO(EBADF,963extattr_get_fd(-1, EXTATTR_NAMESPACE_USER, name, NULL, 0) == -1);964check_audit(fds, extregex, pipefd);965}966967ATF_TC_CLEANUP(extattr_get_fd_failure, tc)968{969cleanup();970}971972973ATF_TC_WITH_CLEANUP(extattr_get_link_success);974ATF_TC_HEAD(extattr_get_link_success, tc)975{976atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "977"extattr_get_link(2) call");978}979980ATF_TC_BODY(extattr_get_link_success, tc)981{982/* Symbolic link needs to exist to call extattr_get_link(2) */983ATF_REQUIRE_EQ(0, symlink("symlink", path));984skip_if_extattr_not_supported(".");985986/* Set an extended attribute to be retrieved later on */987REQUIRE_EXTATTR_RESULT(sizeof(buff),988extattr_set_link(path, EXTATTR_NAMESPACE_USER, name, buff,989sizeof(buff)));990991/* Prepare the regex to be checked in the audit record */992snprintf(extregex, sizeof(extregex),993"extattr_get_link.*%s.*%s.*return,success", path, name);994995FILE *pipefd = setup(fds, auclass);996REQUIRE_EXTATTR_RESULT(sizeof(buff),997extattr_get_link(path, EXTATTR_NAMESPACE_USER, name, NULL, 0));998check_audit(fds, extregex, pipefd);999}10001001ATF_TC_CLEANUP(extattr_get_link_success, tc)1002{1003cleanup();1004}100510061007ATF_TC_WITH_CLEANUP(extattr_get_link_failure);1008ATF_TC_HEAD(extattr_get_link_failure, tc)1009{1010atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1011"extattr_get_link(2) call");1012}10131014ATF_TC_BODY(extattr_get_link_failure, tc)1015{1016/* Prepare the regex to be checked in the audit record */1017snprintf(extregex, sizeof(extregex),1018"extattr_get_link.*%s.*%s.*failure", path, name);1019FILE *pipefd = setup(fds, auclass);1020/* Failure reason: symbolic link does not exist */1021ATF_REQUIRE_ERRNO(ENOENT,1022extattr_get_link(path, EXTATTR_NAMESPACE_USER, name, NULL, 0));1023check_audit(fds, extregex, pipefd);1024}10251026ATF_TC_CLEANUP(extattr_get_link_failure, tc)1027{1028cleanup();1029}103010311032ATF_TC_WITH_CLEANUP(extattr_list_file_success);1033ATF_TC_HEAD(extattr_list_file_success, tc)1034{1035atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "1036"extattr_list_file(2) call");1037}10381039ATF_TC_BODY(extattr_list_file_success, tc)1040{1041ssize_t readbuff;1042/* File needs to exist to call extattr_list_file(2) */1043ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);1044skip_if_extattr_not_supported(path);10451046FILE *pipefd = setup(fds, auclass);1047readbuff = REQUIRE_EXTATTR_SUCCESS(1048extattr_list_file(path, EXTATTR_NAMESPACE_USER, NULL, 0));1049/* Prepare the regex to be checked in the audit record */1050snprintf(extregex, sizeof(extregex),1051"extattr_list_file.*%s.*return,success,%zd", path, readbuff);1052check_audit(fds, extregex, pipefd);1053}10541055ATF_TC_CLEANUP(extattr_list_file_success, tc)1056{1057cleanup();1058}105910601061ATF_TC_WITH_CLEANUP(extattr_list_file_failure);1062ATF_TC_HEAD(extattr_list_file_failure, tc)1063{1064atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1065"extattr_list_file(2) call");1066}10671068ATF_TC_BODY(extattr_list_file_failure, tc)1069{1070/* Prepare the regex to be checked in the audit record */1071snprintf(extregex, sizeof(extregex),1072"extattr_list_file.*%s.*return,failure", path);10731074FILE *pipefd = setup(fds, auclass);1075/* Failure reason: file does not exist */1076ATF_REQUIRE_ERRNO(ENOENT,1077extattr_list_file(path, EXTATTR_NAMESPACE_USER, NULL, 0));1078check_audit(fds, extregex, pipefd);1079}10801081ATF_TC_CLEANUP(extattr_list_file_failure, tc)1082{1083cleanup();1084}108510861087ATF_TC_WITH_CLEANUP(extattr_list_fd_success);1088ATF_TC_HEAD(extattr_list_fd_success, tc)1089{1090atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "1091"extattr_list_fd(2) call");1092}10931094ATF_TC_BODY(extattr_list_fd_success, tc)1095{1096ssize_t readbuff;1097/* File needs to exist to call extattr_list_fd(2) */1098ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);1099skip_if_extattr_not_supported(path);11001101FILE *pipefd = setup(fds, auclass);1102readbuff = REQUIRE_EXTATTR_SUCCESS(1103extattr_list_fd(filedesc, EXTATTR_NAMESPACE_USER, NULL, 0));1104/* Prepare the regex to be checked in the audit record */1105snprintf(extregex, sizeof(extregex),1106"extattr_list_fd.*return,success,%zd", readbuff);1107check_audit(fds, extregex, pipefd);1108close(filedesc);1109}11101111ATF_TC_CLEANUP(extattr_list_fd_success, tc)1112{1113cleanup();1114}111511161117ATF_TC_WITH_CLEANUP(extattr_list_fd_failure);1118ATF_TC_HEAD(extattr_list_fd_failure, tc)1119{1120atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1121"extattr_list_fd(2) call");1122}11231124ATF_TC_BODY(extattr_list_fd_failure, tc)1125{1126/* Prepare the regex to be checked in the audit record */1127snprintf(extregex, sizeof(extregex),1128"extattr_list_fd.*return,failure : Bad file descriptor");11291130FILE *pipefd = setup(fds, auclass);1131/* Failure reason: Invalid file descriptor */1132ATF_REQUIRE_ERRNO(EBADF,1133extattr_list_fd(-1, EXTATTR_NAMESPACE_USER, NULL, 0) == -1);1134check_audit(fds, extregex, pipefd);1135}11361137ATF_TC_CLEANUP(extattr_list_fd_failure, tc)1138{1139cleanup();1140}114111421143ATF_TC_WITH_CLEANUP(extattr_list_link_success);1144ATF_TC_HEAD(extattr_list_link_success, tc)1145{1146atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "1147"extattr_list_link(2) call");1148}11491150ATF_TC_BODY(extattr_list_link_success, tc)1151{1152ssize_t readbuff;1153/* Symbolic link needs to exist to call extattr_list_link(2) */1154ATF_REQUIRE_EQ(0, symlink("symlink", path));1155skip_if_extattr_not_supported(".");11561157FILE *pipefd = setup(fds, auclass);1158readbuff = REQUIRE_EXTATTR_SUCCESS(1159extattr_list_link(path, EXTATTR_NAMESPACE_USER, NULL, 0));1160/* Prepare the regex to be checked in the audit record */1161snprintf(extregex, sizeof(extregex),1162"extattr_list_link.*%s.*return,success,%zd", path, readbuff);1163check_audit(fds, extregex, pipefd);1164}11651166ATF_TC_CLEANUP(extattr_list_link_success, tc)1167{1168cleanup();1169}117011711172ATF_TC_WITH_CLEANUP(extattr_list_link_failure);1173ATF_TC_HEAD(extattr_list_link_failure, tc)1174{1175atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1176"extattr_list_link(2) call");1177}11781179ATF_TC_BODY(extattr_list_link_failure, tc)1180{1181/* Prepare the regex to be checked in the audit record */1182snprintf(extregex, sizeof(extregex),1183"extattr_list_link.*%s.*failure", path);1184FILE *pipefd = setup(fds, auclass);1185/* Failure reason: symbolic link does not exist */1186ATF_REQUIRE_ERRNO(ENOENT,1187extattr_list_link(path, EXTATTR_NAMESPACE_USER, NULL, 0) == -1);1188check_audit(fds, extregex, pipefd);1189}11901191ATF_TC_CLEANUP(extattr_list_link_failure, tc)1192{1193cleanup();1194}119511961197ATF_TP_ADD_TCS(tp)1198{1199ATF_TP_ADD_TC(tp, stat_success);1200ATF_TP_ADD_TC(tp, stat_failure);1201ATF_TP_ADD_TC(tp, lstat_success);1202ATF_TP_ADD_TC(tp, lstat_failure);1203ATF_TP_ADD_TC(tp, fstat_success);1204ATF_TP_ADD_TC(tp, fstat_failure);1205ATF_TP_ADD_TC(tp, fstatat_success);1206ATF_TP_ADD_TC(tp, fstatat_failure);12071208ATF_TP_ADD_TC(tp, statfs_success);1209ATF_TP_ADD_TC(tp, statfs_failure);1210ATF_TP_ADD_TC(tp, fstatfs_success);1211ATF_TP_ADD_TC(tp, fstatfs_failure);12121213ATF_TP_ADD_TC(tp, getfsstat_success);1214ATF_TP_ADD_TC(tp, getfsstat_failure);12151216ATF_TP_ADD_TC(tp, lgetfh_success);1217ATF_TP_ADD_TC(tp, lgetfh_failure);1218ATF_TP_ADD_TC(tp, fhopen_success);1219ATF_TP_ADD_TC(tp, fhopen_failure);1220ATF_TP_ADD_TC(tp, fhstat_success);1221ATF_TP_ADD_TC(tp, fhstat_failure);1222ATF_TP_ADD_TC(tp, fhstatfs_success);1223ATF_TP_ADD_TC(tp, fhstatfs_failure);12241225ATF_TP_ADD_TC(tp, access_success);1226ATF_TP_ADD_TC(tp, access_failure);1227ATF_TP_ADD_TC(tp, eaccess_success);1228ATF_TP_ADD_TC(tp, eaccess_failure);1229ATF_TP_ADD_TC(tp, faccessat_success);1230ATF_TP_ADD_TC(tp, faccessat_failure);12311232ATF_TP_ADD_TC(tp, pathconf_success);1233ATF_TP_ADD_TC(tp, pathconf_failure);1234ATF_TP_ADD_TC(tp, lpathconf_success);1235ATF_TP_ADD_TC(tp, lpathconf_failure);1236ATF_TP_ADD_TC(tp, fpathconf_success);1237ATF_TP_ADD_TC(tp, fpathconf_failure);12381239ATF_TP_ADD_TC(tp, extattr_get_file_success);1240ATF_TP_ADD_TC(tp, extattr_get_file_failure);1241ATF_TP_ADD_TC(tp, extattr_get_fd_success);1242ATF_TP_ADD_TC(tp, extattr_get_fd_failure);1243ATF_TP_ADD_TC(tp, extattr_get_link_success);1244ATF_TP_ADD_TC(tp, extattr_get_link_failure);12451246ATF_TP_ADD_TC(tp, extattr_list_file_success);1247ATF_TP_ADD_TC(tp, extattr_list_file_failure);1248ATF_TP_ADD_TC(tp, extattr_list_fd_success);1249ATF_TP_ADD_TC(tp, extattr_list_fd_failure);1250ATF_TP_ADD_TC(tp, extattr_list_link_success);1251ATF_TP_ADD_TC(tp, extattr_list_link_failure);1252return (atf_no_error());1253}125412551256