Path: blob/main/tests/sys/audit/file-attribute-modify.c
39507 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/types.h>26#include <sys/extattr.h>27#include <sys/file.h>28#include <sys/mman.h>29#include <sys/stat.h>30#include <sys/time.h>3132#include <atf-c.h>33#include <errno.h>34#include <fcntl.h>35#include <stdint.h>36#include <unistd.h>3738#include "utils.h"3940static pid_t pid;41static uid_t uid = -1;42static gid_t gid = -1;43static int filedesc, retval;44static struct pollfd fds[1];45static mode_t mode = 0777;46static char extregex[80];47static char buff[] = "ezio";48static const char *auclass = "fm";49static const char *name = "authorname";50static const char *path = "fileforaudit";51static const char *errpath = "adirhasnoname/fileforaudit";52static const char *successreg = "fileforaudit.*return,success";53static const char *failurereg = "fileforaudit.*return,failure";545556ATF_TC_WITH_CLEANUP(flock_success);57ATF_TC_HEAD(flock_success, tc)58{59atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "60"flock(2) call");61}6263ATF_TC_BODY(flock_success, tc)64{65pid = getpid();66snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);6768/* File needs to exist to call flock(2) */69ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);70FILE *pipefd = setup(fds, auclass);71ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));72check_audit(fds, extregex, pipefd);73close(filedesc);74}7576ATF_TC_CLEANUP(flock_success, tc)77{78cleanup();79}808182ATF_TC_WITH_CLEANUP(flock_failure);83ATF_TC_HEAD(flock_failure, tc)84{85atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "86"flock(2) call");87}8889ATF_TC_BODY(flock_failure, tc)90{91const char *regex = "flock.*return,failure : Bad file descriptor";92FILE *pipefd = setup(fds, auclass);93ATF_REQUIRE_ERRNO(EBADF, flock(-1, LOCK_SH) == -1);94check_audit(fds, regex, pipefd);95}9697ATF_TC_CLEANUP(flock_failure, tc)98{99cleanup();100}101102103ATF_TC_WITH_CLEANUP(fcntl_success);104ATF_TC_HEAD(fcntl_success, tc)105{106atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "107"fcntl(2) call");108}109110ATF_TC_BODY(fcntl_success, tc)111{112int flagstatus;113/* File needs to exist to call fcntl(2) */114ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);115FILE *pipefd = setup(fds, auclass);116117/* Retrieve the status flags of 'filedesc' and store it in flagstatus */118ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);119snprintf(extregex, sizeof(extregex),120"fcntl.*return,success,%d", flagstatus);121check_audit(fds, extregex, pipefd);122close(filedesc);123}124125ATF_TC_CLEANUP(fcntl_success, tc)126{127cleanup();128}129130131ATF_TC_WITH_CLEANUP(fcntl_failure);132ATF_TC_HEAD(fcntl_failure, tc)133{134atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "135"fcntl(2) call");136}137138ATF_TC_BODY(fcntl_failure, tc)139{140const char *regex = "fcntl.*return,failure : Bad file descriptor";141FILE *pipefd = setup(fds, auclass);142ATF_REQUIRE_ERRNO(EBADF, fcntl(-1, F_GETFL, 0) == -1);143check_audit(fds, regex, pipefd);144}145146ATF_TC_CLEANUP(fcntl_failure, tc)147{148cleanup();149}150151152ATF_TC_WITH_CLEANUP(fsync_success);153ATF_TC_HEAD(fsync_success, tc)154{155atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "156"fsync(2) call");157}158159ATF_TC_BODY(fsync_success, tc)160{161pid = getpid();162snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);163164/* File needs to exist to call fsync(2) */165ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);166FILE *pipefd = setup(fds, auclass);167ATF_REQUIRE_EQ(0, fsync(filedesc));168check_audit(fds, extregex, pipefd);169close(filedesc);170}171172ATF_TC_CLEANUP(fsync_success, tc)173{174cleanup();175}176177178ATF_TC_WITH_CLEANUP(fsync_failure);179ATF_TC_HEAD(fsync_failure, tc)180{181atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "182"fsync(2) call");183}184185ATF_TC_BODY(fsync_failure, tc)186{187const char *regex = "fsync.*return,failure : Bad file descriptor";188FILE *pipefd = setup(fds, auclass);189/* Failure reason: Invalid file descriptor */190ATF_REQUIRE_ERRNO(EBADF, fsync(-1) == -1);191check_audit(fds, regex, pipefd);192}193194ATF_TC_CLEANUP(fsync_failure, tc)195{196cleanup();197}198199200ATF_TC_WITH_CLEANUP(chmod_success);201ATF_TC_HEAD(chmod_success, tc)202{203atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "204"chmod(2) call");205}206207ATF_TC_BODY(chmod_success, tc)208{209/* File needs to exist to call chmod(2) */210ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);211FILE *pipefd = setup(fds, auclass);212ATF_REQUIRE_EQ(0, chmod(path, mode));213check_audit(fds, successreg, pipefd);214close(filedesc);215}216217ATF_TC_CLEANUP(chmod_success, tc)218{219cleanup();220}221222223ATF_TC_WITH_CLEANUP(chmod_failure);224ATF_TC_HEAD(chmod_failure, tc)225{226atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "227"chmod(2) call");228}229230ATF_TC_BODY(chmod_failure, tc)231{232FILE *pipefd = setup(fds, auclass);233/* Failure reason: file does not exist */234ATF_REQUIRE_ERRNO(ENOENT, chmod(errpath, mode) == -1);235check_audit(fds, failurereg, pipefd);236}237238ATF_TC_CLEANUP(chmod_failure, tc)239{240cleanup();241}242243244ATF_TC_WITH_CLEANUP(fchmod_success);245ATF_TC_HEAD(fchmod_success, tc)246{247atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "248"fchmod(2) call");249}250251ATF_TC_BODY(fchmod_success, tc)252{253pid = getpid();254snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);255256/* File needs to exist to call fchmod(2) */257ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);258FILE *pipefd = setup(fds, auclass);259ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));260check_audit(fds, extregex, pipefd);261close(filedesc);262}263264ATF_TC_CLEANUP(fchmod_success, tc)265{266cleanup();267}268269270ATF_TC_WITH_CLEANUP(fchmod_failure);271ATF_TC_HEAD(fchmod_failure, tc)272{273atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "274"fchmod(2) call");275}276277ATF_TC_BODY(fchmod_failure, tc)278{279const char *regex = "fchmod.*return,failure : Bad file descriptor";280FILE *pipefd = setup(fds, auclass);281/* Failure reason: Invalid file descriptor */282ATF_REQUIRE_ERRNO(EBADF, fchmod(-1, mode) == -1);283check_audit(fds, regex, pipefd);284}285286ATF_TC_CLEANUP(fchmod_failure, tc)287{288cleanup();289}290291292ATF_TC_WITH_CLEANUP(lchmod_success);293ATF_TC_HEAD(lchmod_success, tc)294{295atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "296"lchmod(2) call");297}298299ATF_TC_BODY(lchmod_success, tc)300{301/* Symbolic link needs to exist to call lchmod(2) */302ATF_REQUIRE_EQ(0, symlink("symlink", path));303FILE *pipefd = setup(fds, auclass);304ATF_REQUIRE_EQ(0, lchmod(path, mode));305check_audit(fds, successreg, pipefd);306}307308ATF_TC_CLEANUP(lchmod_success, tc)309{310cleanup();311}312313314ATF_TC_WITH_CLEANUP(lchmod_failure);315ATF_TC_HEAD(lchmod_failure, tc)316{317atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "318"lchmod(2) call");319}320321ATF_TC_BODY(lchmod_failure, tc)322{323FILE *pipefd = setup(fds, auclass);324/* Failure reason: file does not exist */325ATF_REQUIRE_ERRNO(ENOENT, lchmod(errpath, mode) == -1);326check_audit(fds, failurereg, pipefd);327}328329ATF_TC_CLEANUP(lchmod_failure, tc)330{331cleanup();332}333334335ATF_TC_WITH_CLEANUP(fchmodat_success);336ATF_TC_HEAD(fchmodat_success, tc)337{338atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "339"fchmodat(2) call");340}341342ATF_TC_BODY(fchmodat_success, tc)343{344/* File needs to exist to call fchmodat(2) */345ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);346FILE *pipefd = setup(fds, auclass);347ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));348check_audit(fds, successreg, pipefd);349close(filedesc);350}351352ATF_TC_CLEANUP(fchmodat_success, tc)353{354cleanup();355}356357358ATF_TC_WITH_CLEANUP(fchmodat_failure);359ATF_TC_HEAD(fchmodat_failure, tc)360{361atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "362"fchmodat(2) call");363}364365ATF_TC_BODY(fchmodat_failure, tc)366{367FILE *pipefd = setup(fds, auclass);368/* Failure reason: file does not exist */369ATF_REQUIRE_ERRNO(ENOENT, fchmodat(AT_FDCWD, errpath, mode, 0) == -1);370check_audit(fds, failurereg, pipefd);371}372373ATF_TC_CLEANUP(fchmodat_failure, tc)374{375cleanup();376}377378379ATF_TC_WITH_CLEANUP(chown_success);380ATF_TC_HEAD(chown_success, tc)381{382atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "383"chown(2) call");384}385386ATF_TC_BODY(chown_success, tc)387{388/* File needs to exist to call chown(2) */389ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);390FILE *pipefd = setup(fds, auclass);391ATF_REQUIRE_EQ(0, chown(path, uid, gid));392check_audit(fds, successreg, pipefd);393close(filedesc);394}395396ATF_TC_CLEANUP(chown_success, tc)397{398cleanup();399}400401402ATF_TC_WITH_CLEANUP(chown_failure);403ATF_TC_HEAD(chown_failure, tc)404{405atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "406"chown(2) call");407}408409ATF_TC_BODY(chown_failure, tc)410{411FILE *pipefd = setup(fds, auclass);412/* Failure reason: file does not exist */413ATF_REQUIRE_ERRNO(ENOENT, chown(errpath, uid, gid) == -1);414check_audit(fds, failurereg, pipefd);415}416417ATF_TC_CLEANUP(chown_failure, tc)418{419cleanup();420}421422423ATF_TC_WITH_CLEANUP(fchown_success);424ATF_TC_HEAD(fchown_success, tc)425{426atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "427"fchown(2) call");428}429430ATF_TC_BODY(fchown_success, tc)431{432pid = getpid();433snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid);434435/* File needs to exist to call fchown(2) */436ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);437FILE *pipefd = setup(fds, auclass);438ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid));439check_audit(fds, extregex, pipefd);440close(filedesc);441}442443ATF_TC_CLEANUP(fchown_success, tc)444{445cleanup();446}447448449ATF_TC_WITH_CLEANUP(fchown_failure);450ATF_TC_HEAD(fchown_failure, tc)451{452atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "453"fchown(2) call");454}455456ATF_TC_BODY(fchown_failure, tc)457{458const char *regex = "fchown.*return,failure : Bad file descriptor";459FILE *pipefd = setup(fds, auclass);460/* Failure reason: Invalid file descriptor */461ATF_REQUIRE_ERRNO(EBADF, fchown(-1, uid, gid) == -1);462check_audit(fds, regex, pipefd);463}464465ATF_TC_CLEANUP(fchown_failure, tc)466{467cleanup();468}469470471ATF_TC_WITH_CLEANUP(lchown_success);472ATF_TC_HEAD(lchown_success, tc)473{474atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "475"lchown(2) call");476}477478ATF_TC_BODY(lchown_success, tc)479{480/* Symbolic link needs to exist to call lchown(2) */481ATF_REQUIRE_EQ(0, symlink("symlink", path));482FILE *pipefd = setup(fds, auclass);483ATF_REQUIRE_EQ(0, lchown(path, uid, gid));484check_audit(fds, successreg, pipefd);485}486487ATF_TC_CLEANUP(lchown_success, tc)488{489cleanup();490}491492493ATF_TC_WITH_CLEANUP(lchown_failure);494ATF_TC_HEAD(lchown_failure, tc)495{496atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "497"lchown(2) call");498}499500ATF_TC_BODY(lchown_failure, tc)501{502FILE *pipefd = setup(fds, auclass);503/* Failure reason: Symbolic link does not exist */504ATF_REQUIRE_ERRNO(ENOENT, lchown(errpath, uid, gid) == -1);505check_audit(fds, failurereg, pipefd);506}507508ATF_TC_CLEANUP(lchown_failure, tc)509{510cleanup();511}512513514ATF_TC_WITH_CLEANUP(fchownat_success);515ATF_TC_HEAD(fchownat_success, tc)516{517atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "518"fchownat(2) call");519}520521ATF_TC_BODY(fchownat_success, tc)522{523/* File needs to exist to call fchownat(2) */524ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);525FILE *pipefd = setup(fds, auclass);526ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0));527check_audit(fds, successreg, pipefd);528close(filedesc);529}530531ATF_TC_CLEANUP(fchownat_success, tc)532{533cleanup();534}535536537ATF_TC_WITH_CLEANUP(fchownat_failure);538ATF_TC_HEAD(fchownat_failure, tc)539{540atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "541"fchownat(2) call");542}543544ATF_TC_BODY(fchownat_failure, tc)545{546FILE *pipefd = setup(fds, auclass);547/* Failure reason: file does not exist */548ATF_REQUIRE_ERRNO(ENOENT,549fchownat(AT_FDCWD, errpath, uid, gid, 0) == -1);550check_audit(fds, failurereg, pipefd);551}552553ATF_TC_CLEANUP(fchownat_failure, tc)554{555cleanup();556}557558559ATF_TC_WITH_CLEANUP(chflags_success);560ATF_TC_HEAD(chflags_success, tc)561{562atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "563"chflags(2) call");564}565566ATF_TC_BODY(chflags_success, tc)567{568/* File needs to exist to call chflags(2) */569ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);570FILE *pipefd = setup(fds, auclass);571ATF_REQUIRE_EQ(0, chflags(path, UF_OFFLINE));572check_audit(fds, successreg, pipefd);573close(filedesc);574}575576ATF_TC_CLEANUP(chflags_success, tc)577{578cleanup();579}580581582ATF_TC_WITH_CLEANUP(chflags_failure);583ATF_TC_HEAD(chflags_failure, tc)584{585atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "586"chflags(2) call");587}588589ATF_TC_BODY(chflags_failure, tc)590{591FILE *pipefd = setup(fds, auclass);592/* Failure reason: file does not exist */593ATF_REQUIRE_ERRNO(ENOENT, chflags(errpath, UF_OFFLINE) == -1);594check_audit(fds, failurereg, pipefd);595}596597ATF_TC_CLEANUP(chflags_failure, tc)598{599cleanup();600}601602603ATF_TC_WITH_CLEANUP(fchflags_success);604ATF_TC_HEAD(fchflags_success, tc)605{606atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "607"fchflags(2) call");608}609610ATF_TC_BODY(fchflags_success, tc)611{612pid = getpid();613snprintf(extregex, sizeof(extregex), "fchflags.*%d.*ret.*success", pid);614/* File needs to exist to call fchflags(2) */615ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);616617FILE *pipefd = setup(fds, auclass);618ATF_REQUIRE_EQ(0, fchflags(filedesc, UF_OFFLINE));619check_audit(fds, extregex, pipefd);620close(filedesc);621}622623ATF_TC_CLEANUP(fchflags_success, tc)624{625cleanup();626}627628629ATF_TC_WITH_CLEANUP(fchflags_failure);630ATF_TC_HEAD(fchflags_failure, tc)631{632atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "633"fchflags(2) call");634}635636ATF_TC_BODY(fchflags_failure, tc)637{638const char *regex = "fchflags.*return,failure : Bad file descriptor";639FILE *pipefd = setup(fds, auclass);640/* Failure reason: Invalid file descriptor */641ATF_REQUIRE_ERRNO(EBADF, fchflags(-1, UF_OFFLINE) == -1);642check_audit(fds, regex, pipefd);643}644645ATF_TC_CLEANUP(fchflags_failure, tc)646{647cleanup();648}649650651ATF_TC_WITH_CLEANUP(lchflags_success);652ATF_TC_HEAD(lchflags_success, tc)653{654atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "655"lchflags(2) call");656}657658ATF_TC_BODY(lchflags_success, tc)659{660/* Symbolic link needs to exist to call lchflags(2) */661ATF_REQUIRE_EQ(0, symlink("symlink", path));662FILE *pipefd = setup(fds, auclass);663ATF_REQUIRE_EQ(0, lchflags(path, UF_OFFLINE));664check_audit(fds, successreg, pipefd);665}666667ATF_TC_CLEANUP(lchflags_success, tc)668{669cleanup();670}671672673ATF_TC_WITH_CLEANUP(lchflags_failure);674ATF_TC_HEAD(lchflags_failure, tc)675{676atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "677"lchflags(2) call");678}679680ATF_TC_BODY(lchflags_failure, tc)681{682FILE *pipefd = setup(fds, auclass);683/* Failure reason: Symbolic link does not exist */684ATF_REQUIRE_ERRNO(ENOENT, lchflags(errpath, UF_OFFLINE) == -1);685check_audit(fds, failurereg, pipefd);686}687688ATF_TC_CLEANUP(lchflags_failure, tc)689{690cleanup();691}692693694ATF_TC_WITH_CLEANUP(chflagsat_success);695ATF_TC_HEAD(chflagsat_success, tc)696{697atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "698"chflagsat(2) call");699}700701ATF_TC_BODY(chflagsat_success, tc)702{703/* File needs to exist to call chflagsat(2) */704ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);705FILE *pipefd = setup(fds, auclass);706ATF_REQUIRE_EQ(0, chflagsat(AT_FDCWD, path, UF_OFFLINE, 0));707check_audit(fds, successreg, pipefd);708close(filedesc);709}710711ATF_TC_CLEANUP(chflagsat_success, tc)712{713cleanup();714}715716717ATF_TC_WITH_CLEANUP(chflagsat_failure);718ATF_TC_HEAD(chflagsat_failure, tc)719{720atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "721"chflagsat(2) call");722}723724ATF_TC_BODY(chflagsat_failure, tc)725{726FILE *pipefd = setup(fds, auclass);727/* Failure reason: file does not exist */728ATF_REQUIRE_ERRNO(ENOENT,729chflagsat(AT_FDCWD, errpath, UF_OFFLINE, 0) == -1);730check_audit(fds, failurereg, pipefd);731}732733ATF_TC_CLEANUP(chflagsat_failure, tc)734{735cleanup();736}737738739ATF_TC_WITH_CLEANUP(utimes_success);740ATF_TC_HEAD(utimes_success, tc)741{742atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "743"utimes(2) call");744}745746ATF_TC_BODY(utimes_success, tc)747{748/* File needs to exist to call utimes(2) */749ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);750FILE *pipefd = setup(fds, auclass);751ATF_REQUIRE_EQ(0, utimes(path, NULL));752check_audit(fds, successreg, pipefd);753close(filedesc);754}755756ATF_TC_CLEANUP(utimes_success, tc)757{758cleanup();759}760761762ATF_TC_WITH_CLEANUP(utimes_failure);763ATF_TC_HEAD(utimes_failure, tc)764{765atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "766"utimes(2) call");767}768769ATF_TC_BODY(utimes_failure, tc)770{771FILE *pipefd = setup(fds, auclass);772/* Failure reason: file does not exist */773ATF_REQUIRE_ERRNO(ENOENT, utimes(errpath, NULL) == -1);774check_audit(fds, failurereg, pipefd);775}776777ATF_TC_CLEANUP(utimes_failure, tc)778{779cleanup();780}781782783ATF_TC_WITH_CLEANUP(futimes_success);784ATF_TC_HEAD(futimes_success, tc)785{786atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "787"futimes(2) call");788}789790ATF_TC_BODY(futimes_success, tc)791{792pid = getpid();793snprintf(extregex, sizeof(extregex), "futimes.*%d.*ret.*success", pid);794795/* File needs to exist to call futimes(2) */796ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);797FILE *pipefd = setup(fds, auclass);798ATF_REQUIRE_EQ(0, futimes(filedesc, NULL));799check_audit(fds, extregex, pipefd);800close(filedesc);801}802803ATF_TC_CLEANUP(futimes_success, tc)804{805cleanup();806}807808809ATF_TC_WITH_CLEANUP(futimes_failure);810ATF_TC_HEAD(futimes_failure, tc)811{812atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "813"futimes(2) call");814}815816ATF_TC_BODY(futimes_failure, tc)817{818const char *regex = "futimes.*return,failure : Bad file descriptor";819FILE *pipefd = setup(fds, auclass);820/* Failure reason: Invalid file descriptor */821ATF_REQUIRE_ERRNO(EBADF, futimes(-1, NULL) == -1);822check_audit(fds, regex, pipefd);823}824825ATF_TC_CLEANUP(futimes_failure, tc)826{827cleanup();828}829830831ATF_TC_WITH_CLEANUP(lutimes_success);832ATF_TC_HEAD(lutimes_success, tc)833{834atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "835"lutimes(2) call");836}837838ATF_TC_BODY(lutimes_success, tc)839{840/* Symbolic link needs to exist to call lutimes(2) */841ATF_REQUIRE_EQ(0, symlink("symlink", path));842FILE *pipefd = setup(fds, auclass);843ATF_REQUIRE_EQ(0, lutimes(path, NULL));844check_audit(fds, successreg, pipefd);845}846847ATF_TC_CLEANUP(lutimes_success, tc)848{849cleanup();850}851852853ATF_TC_WITH_CLEANUP(lutimes_failure);854ATF_TC_HEAD(lutimes_failure, tc)855{856atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "857"lutimes(2) call");858}859860ATF_TC_BODY(lutimes_failure, tc)861{862FILE *pipefd = setup(fds, auclass);863/* Failure reason: symbolic link does not exist */864ATF_REQUIRE_ERRNO(ENOENT, lutimes(errpath, NULL) == -1);865check_audit(fds, failurereg, pipefd);866}867868ATF_TC_CLEANUP(lutimes_failure, tc)869{870cleanup();871}872873874ATF_TC_WITH_CLEANUP(futimesat_success);875ATF_TC_HEAD(futimesat_success, tc)876{877atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "878"futimesat(2) call");879}880881ATF_TC_BODY(futimesat_success, tc)882{883/* File needs to exist to call futimesat(2) */884ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);885FILE *pipefd = setup(fds, auclass);886ATF_REQUIRE_EQ(0, futimesat(AT_FDCWD, path, NULL));887check_audit(fds, successreg, pipefd);888close(filedesc);889}890891ATF_TC_CLEANUP(futimesat_success, tc)892{893cleanup();894}895896897ATF_TC_WITH_CLEANUP(futimesat_failure);898ATF_TC_HEAD(futimesat_failure, tc)899{900atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "901"futimesat(2) call");902}903904ATF_TC_BODY(futimesat_failure, tc)905{906FILE *pipefd = setup(fds, auclass);907/* Failure reason: file does not exist */908ATF_REQUIRE_ERRNO(ENOENT, futimesat(AT_FDCWD, errpath, NULL) == -1);909check_audit(fds, failurereg, pipefd);910}911912ATF_TC_CLEANUP(futimesat_failure, tc)913{914cleanup();915}916917918ATF_TC_WITH_CLEANUP(mprotect_success);919ATF_TC_HEAD(mprotect_success, tc)920{921atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "922"mprotect(2) call");923}924925ATF_TC_BODY(mprotect_success, tc)926{927pid = getpid();928snprintf(extregex, sizeof(extregex), "mprotect.*%d.*ret.*success", pid);929930FILE *pipefd = setup(fds, auclass);931ATF_REQUIRE_EQ(0, mprotect(NULL, 0, PROT_NONE));932check_audit(fds, extregex, pipefd);933}934935ATF_TC_CLEANUP(mprotect_success, tc)936{937cleanup();938}939940941ATF_TC_WITH_CLEANUP(mprotect_failure);942ATF_TC_HEAD(mprotect_failure, tc)943{944atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "945"mprotect(2) call");946}947948ATF_TC_BODY(mprotect_failure, tc)949{950const char *regex = "mprotect.*return,failure : Invalid argument";951FILE *pipefd = setup(fds, auclass);952ATF_REQUIRE_ERRNO(EINVAL,953mprotect((void *)SIZE_MAX, -1, PROT_NONE) == -1);954check_audit(fds, regex, pipefd);955}956957ATF_TC_CLEANUP(mprotect_failure, tc)958{959cleanup();960}961962/*963* undelete(2) only works on whiteout files in union file system. Hence, no964* test case for successful invocation.965*/966967ATF_TC_WITH_CLEANUP(undelete_failure);968ATF_TC_HEAD(undelete_failure, tc)969{970atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "971"undelete(2) call");972}973974ATF_TC_BODY(undelete_failure, tc)975{976pid = getpid();977snprintf(extregex, sizeof(extregex), "undelete.*%d.*ret.*failure", pid);978979FILE *pipefd = setup(fds, auclass);980/* Failure reason: File does not exist */981ATF_REQUIRE_ERRNO(ENOENT, undelete(errpath) == -1);982check_audit(fds, extregex, pipefd);983}984985ATF_TC_CLEANUP(undelete_failure, tc)986{987cleanup();988}989990991ATF_TC_WITH_CLEANUP(extattr_set_file_success);992ATF_TC_HEAD(extattr_set_file_success, tc)993{994atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "995"extattr_set_file(2) call");996}997998ATF_TC_BODY(extattr_set_file_success, tc)999{1000/* File needs to exist to call extattr_set_file(2) */1001ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);1002skip_if_extattr_not_supported(path);10031004/* Prepare the regex to be checked in the audit record */1005snprintf(extregex, sizeof(extregex),1006"extattr_set_file.*%s.*%s.*return,success", path, name);10071008FILE *pipefd = setup(fds, auclass);1009REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,1010EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));1011check_audit(fds, extregex, pipefd);1012close(filedesc);1013}10141015ATF_TC_CLEANUP(extattr_set_file_success, tc)1016{1017cleanup();1018}101910201021ATF_TC_WITH_CLEANUP(extattr_set_file_failure);1022ATF_TC_HEAD(extattr_set_file_failure, tc)1023{1024atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1025"extattr_set_file(2) call");1026}10271028ATF_TC_BODY(extattr_set_file_failure, tc)1029{1030/* Prepare the regex to be checked in the audit record */1031snprintf(extregex, sizeof(extregex),1032"extattr_set_file.*%s.*%s.*failure", path, name);10331034FILE *pipefd = setup(fds, auclass);1035/* Failure reason: file does not exist */1036ATF_REQUIRE_ERRNO(ENOENT,1037extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==1038-1);1039check_audit(fds, extregex, pipefd);1040}10411042ATF_TC_CLEANUP(extattr_set_file_failure, tc)1043{1044cleanup();1045}104610471048ATF_TC_WITH_CLEANUP(extattr_set_fd_success);1049ATF_TC_HEAD(extattr_set_fd_success, tc)1050{1051atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "1052"extattr_set_fd(2) call");1053}10541055ATF_TC_BODY(extattr_set_fd_success, tc)1056{1057/* File needs to exist to call extattr_set_fd(2) */1058ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);1059skip_if_extattr_not_supported(path);10601061/* Prepare the regex to be checked in the audit record */1062snprintf(extregex, sizeof(extregex),1063"extattr_set_fd.*%s.*return,success", name);10641065FILE *pipefd = setup(fds, auclass);1066REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_fd(filedesc,1067EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));1068check_audit(fds, extregex, pipefd);1069close(filedesc);1070}10711072ATF_TC_CLEANUP(extattr_set_fd_success, tc)1073{1074cleanup();1075}107610771078ATF_TC_WITH_CLEANUP(extattr_set_fd_failure);1079ATF_TC_HEAD(extattr_set_fd_failure, tc)1080{1081atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1082"extattr_set_fd(2) call");1083}10841085ATF_TC_BODY(extattr_set_fd_failure, tc)1086{1087/* Prepare the regex to be checked in the audit record */1088snprintf(extregex, sizeof(extregex),1089"extattr_set_fd.*%s.*return,failure : Bad file descriptor", name);10901091FILE *pipefd = setup(fds, auclass);1092/* Failure reason: Invalid file descriptor */1093ATF_REQUIRE_ERRNO(EBADF,1094extattr_set_fd(-1, EXTATTR_NAMESPACE_USER, name, NULL, 0) == -1);1095check_audit(fds, extregex, pipefd);1096}10971098ATF_TC_CLEANUP(extattr_set_fd_failure, tc)1099{1100cleanup();1101}110211031104ATF_TC_WITH_CLEANUP(extattr_set_link_success);1105ATF_TC_HEAD(extattr_set_link_success, tc)1106{1107atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "1108"extattr_set_link(2) call");1109}11101111ATF_TC_BODY(extattr_set_link_success, tc)1112{1113/* Symbolic link needs to exist to call extattr_set_link(2) */1114ATF_REQUIRE_EQ(0, symlink("symlink", path));1115skip_if_extattr_not_supported(".");11161117/* Prepare the regex to be checked in the audit record */1118snprintf(extregex, sizeof(extregex),1119"extattr_set_link.*%s.*%s.*return,success", path, name);11201121FILE *pipefd = setup(fds, auclass);1122REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_link(path,1123EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));11241125check_audit(fds, extregex, pipefd);1126}11271128ATF_TC_CLEANUP(extattr_set_link_success, tc)1129{1130cleanup();1131}113211331134ATF_TC_WITH_CLEANUP(extattr_set_link_failure);1135ATF_TC_HEAD(extattr_set_link_failure, tc)1136{1137atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1138"extattr_set_link(2) call");1139}11401141ATF_TC_BODY(extattr_set_link_failure, tc)1142{1143/* Prepare the regex to be checked in the audit record */1144snprintf(extregex, sizeof(extregex),1145"extattr_set_link.*%s.*%s.*failure", path, name);1146FILE *pipefd = setup(fds, auclass);1147/* Failure reason: symbolic link does not exist */1148ATF_REQUIRE_ERRNO(ENOENT,1149extattr_set_link(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==1150-1);1151check_audit(fds, extregex, pipefd);1152}11531154ATF_TC_CLEANUP(extattr_set_link_failure, tc)1155{1156cleanup();1157}115811591160ATF_TC_WITH_CLEANUP(extattr_delete_file_success);1161ATF_TC_HEAD(extattr_delete_file_success, tc)1162{1163atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "1164"extattr_delete_file(2) call");1165}11661167ATF_TC_BODY(extattr_delete_file_success, tc)1168{1169/* File needs to exist to call extattr_delete_file(2) */1170ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);1171skip_if_extattr_not_supported(path);11721173REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,1174EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));11751176FILE *pipefd = setup(fds, auclass);1177retval = REQUIRE_EXTATTR_SUCCESS(1178extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name));1179/* Prepare the regex to be checked in the audit record */1180snprintf(extregex, sizeof(extregex),1181"extattr_delete_file.*%s.*return,success,%d", path, retval);1182check_audit(fds, extregex, pipefd);1183close(filedesc);1184}11851186ATF_TC_CLEANUP(extattr_delete_file_success, tc)1187{1188cleanup();1189}119011911192ATF_TC_WITH_CLEANUP(extattr_delete_file_failure);1193ATF_TC_HEAD(extattr_delete_file_failure, tc)1194{1195atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1196"extattr_delete_file(2) call");1197}11981199ATF_TC_BODY(extattr_delete_file_failure, tc)1200{1201/* Prepare the regex to be checked in the audit record */1202snprintf(extregex, sizeof(extregex),1203"extattr_delete_file.*%s.*return,failure", path);12041205FILE *pipefd = setup(fds, auclass);1206/* Failure reason: file does not exist */1207ATF_REQUIRE_ERRNO(ENOENT,1208extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name) == -1);1209check_audit(fds, extregex, pipefd);1210}12111212ATF_TC_CLEANUP(extattr_delete_file_failure, tc)1213{1214cleanup();1215}121612171218ATF_TC_WITH_CLEANUP(extattr_delete_fd_success);1219ATF_TC_HEAD(extattr_delete_fd_success, tc)1220{1221atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "1222"extattr_delete_fd(2) call");1223}12241225ATF_TC_BODY(extattr_delete_fd_success, tc)1226{1227/* File needs to exist to call extattr_delete_fd(2) */1228ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);1229skip_if_extattr_not_supported(path);12301231REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,1232EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));12331234FILE *pipefd = setup(fds, auclass);1235retval = REQUIRE_EXTATTR_SUCCESS(extattr_delete_fd(filedesc,1236EXTATTR_NAMESPACE_USER, name));1237/* Prepare the regex to be checked in the audit record */1238snprintf(extregex, sizeof(extregex),1239"extattr_delete_fd.*return,success,%d", retval);1240check_audit(fds, extregex, pipefd);1241close(filedesc);1242}12431244ATF_TC_CLEANUP(extattr_delete_fd_success, tc)1245{1246cleanup();1247}124812491250ATF_TC_WITH_CLEANUP(extattr_delete_fd_failure);1251ATF_TC_HEAD(extattr_delete_fd_failure, tc)1252{1253atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1254"extattr_delete_fd(2) call");1255}12561257ATF_TC_BODY(extattr_delete_fd_failure, tc)1258{1259/* Prepare the regex to be checked in the audit record */1260snprintf(extregex, sizeof(extregex),1261"extattr_delete_fd.*return,failure : Bad file descriptor");12621263FILE *pipefd = setup(fds, auclass);1264/* Failure reason: Invalid file descriptor */1265ATF_REQUIRE_ERRNO(EBADF,1266extattr_delete_fd(-1, EXTATTR_NAMESPACE_USER, name) == -1);1267check_audit(fds, extregex, pipefd);1268}12691270ATF_TC_CLEANUP(extattr_delete_fd_failure, tc)1271{1272cleanup();1273}127412751276ATF_TC_WITH_CLEANUP(extattr_delete_link_success);1277ATF_TC_HEAD(extattr_delete_link_success, tc)1278{1279atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "1280"extattr_delete_link(2) call");1281}12821283ATF_TC_BODY(extattr_delete_link_success, tc)1284{1285/* Symbolic link needs to exist to call extattr_delete_link(2) */1286ATF_REQUIRE_EQ(0, symlink("symlink", path));1287skip_if_extattr_not_supported(".");12881289REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_link(path,1290EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));12911292FILE *pipefd = setup(fds, auclass);1293retval = REQUIRE_EXTATTR_SUCCESS(extattr_delete_link(path,1294EXTATTR_NAMESPACE_USER, name));1295/* Prepare the regex to be checked in the audit record */1296snprintf(extregex, sizeof(extregex),1297"extattr_delete_link.*%s.*return,success,%d", path, retval);1298check_audit(fds, extregex, pipefd);1299}13001301ATF_TC_CLEANUP(extattr_delete_link_success, tc)1302{1303cleanup();1304}130513061307ATF_TC_WITH_CLEANUP(extattr_delete_link_failure);1308ATF_TC_HEAD(extattr_delete_link_failure, tc)1309{1310atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "1311"extattr_delete_link(2) call");1312}13131314ATF_TC_BODY(extattr_delete_link_failure, tc)1315{1316/* Prepare the regex to be checked in the audit record */1317snprintf(extregex, sizeof(extregex),1318"extattr_delete_link.*%s.*failure", path);1319FILE *pipefd = setup(fds, auclass);1320/* Failure reason: symbolic link does not exist */1321ATF_REQUIRE_ERRNO(ENOENT,1322extattr_delete_link(path, EXTATTR_NAMESPACE_USER, name) == -1);1323check_audit(fds, extregex, pipefd);1324}13251326ATF_TC_CLEANUP(extattr_delete_link_failure, tc)1327{1328cleanup();1329}133013311332ATF_TP_ADD_TCS(tp)1333{1334ATF_TP_ADD_TC(tp, flock_success);1335ATF_TP_ADD_TC(tp, flock_failure);1336ATF_TP_ADD_TC(tp, fcntl_success);1337ATF_TP_ADD_TC(tp, fcntl_failure);1338ATF_TP_ADD_TC(tp, fsync_success);1339ATF_TP_ADD_TC(tp, fsync_failure);13401341ATF_TP_ADD_TC(tp, chmod_success);1342ATF_TP_ADD_TC(tp, chmod_failure);1343ATF_TP_ADD_TC(tp, fchmod_success);1344ATF_TP_ADD_TC(tp, fchmod_failure);1345ATF_TP_ADD_TC(tp, lchmod_success);1346ATF_TP_ADD_TC(tp, lchmod_failure);1347ATF_TP_ADD_TC(tp, fchmodat_success);1348ATF_TP_ADD_TC(tp, fchmodat_failure);13491350ATF_TP_ADD_TC(tp, chown_success);1351ATF_TP_ADD_TC(tp, chown_failure);1352ATF_TP_ADD_TC(tp, fchown_success);1353ATF_TP_ADD_TC(tp, fchown_failure);1354ATF_TP_ADD_TC(tp, lchown_success);1355ATF_TP_ADD_TC(tp, lchown_failure);1356ATF_TP_ADD_TC(tp, fchownat_success);1357ATF_TP_ADD_TC(tp, fchownat_failure);13581359ATF_TP_ADD_TC(tp, chflags_success);1360ATF_TP_ADD_TC(tp, chflags_failure);1361ATF_TP_ADD_TC(tp, fchflags_success);1362ATF_TP_ADD_TC(tp, fchflags_failure);1363ATF_TP_ADD_TC(tp, lchflags_success);1364ATF_TP_ADD_TC(tp, lchflags_failure);1365ATF_TP_ADD_TC(tp, chflagsat_success);1366ATF_TP_ADD_TC(tp, chflagsat_failure);13671368ATF_TP_ADD_TC(tp, utimes_success);1369ATF_TP_ADD_TC(tp, utimes_failure);1370ATF_TP_ADD_TC(tp, futimes_success);1371ATF_TP_ADD_TC(tp, futimes_failure);1372ATF_TP_ADD_TC(tp, lutimes_success);1373ATF_TP_ADD_TC(tp, lutimes_failure);1374ATF_TP_ADD_TC(tp, futimesat_success);1375ATF_TP_ADD_TC(tp, futimesat_failure);13761377ATF_TP_ADD_TC(tp, mprotect_success);1378ATF_TP_ADD_TC(tp, mprotect_failure);1379ATF_TP_ADD_TC(tp, undelete_failure);13801381ATF_TP_ADD_TC(tp, extattr_set_file_success);1382ATF_TP_ADD_TC(tp, extattr_set_file_failure);1383ATF_TP_ADD_TC(tp, extattr_set_fd_success);1384ATF_TP_ADD_TC(tp, extattr_set_fd_failure);1385ATF_TP_ADD_TC(tp, extattr_set_link_success);1386ATF_TP_ADD_TC(tp, extattr_set_link_failure);13871388ATF_TP_ADD_TC(tp, extattr_delete_file_success);1389ATF_TP_ADD_TC(tp, extattr_delete_file_failure);1390ATF_TP_ADD_TC(tp, extattr_delete_fd_success);1391ATF_TP_ADD_TC(tp, extattr_delete_fd_failure);1392ATF_TP_ADD_TC(tp, extattr_delete_link_success);1393ATF_TP_ADD_TC(tp, extattr_delete_link_failure);13941395return (atf_no_error());1396}139713981399