16d203d2dSAlan Somers /*- 26d203d2dSAlan Somers * Copyright (c) 2018 Aniket Pandey 36d203d2dSAlan Somers * 46d203d2dSAlan Somers * Redistribution and use in source and binary forms, with or without 56d203d2dSAlan Somers * modification, are permitted provided that the following conditions 66d203d2dSAlan Somers * are met: 76d203d2dSAlan Somers * 1. Redistributions of source code must retain the above copyright 86d203d2dSAlan Somers * notice, this list of conditions and the following disclaimer. 96d203d2dSAlan Somers * 2. Redistributions in binary form must reproduce the above copyright 106d203d2dSAlan Somers * notice, this list of conditions and the following disclaimer in the 116d203d2dSAlan Somers * documentation and/or other materials provided with the distribution. 126d203d2dSAlan Somers * 136d203d2dSAlan Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 146d203d2dSAlan Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 156d203d2dSAlan Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 166d203d2dSAlan Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 176d203d2dSAlan Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 186d203d2dSAlan Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 196d203d2dSAlan Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 206d203d2dSAlan Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 216d203d2dSAlan Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 226d203d2dSAlan Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 236d203d2dSAlan Somers * SUCH DAMAGE. 246d203d2dSAlan Somers * 256d203d2dSAlan Somers * $FreeBSD$ 266d203d2dSAlan Somers */ 276d203d2dSAlan Somers 286d203d2dSAlan Somers #include <sys/file.h> 2928845213SAlan Somers #include <sys/stat.h> 306d203d2dSAlan Somers 316d203d2dSAlan Somers #include <atf-c.h> 326d203d2dSAlan Somers #include <fcntl.h> 336d203d2dSAlan Somers #include <unistd.h> 346d203d2dSAlan Somers 356d203d2dSAlan Somers #include "utils.h" 366d203d2dSAlan Somers 376d203d2dSAlan Somers static pid_t pid; 385c9a4738SAlan Somers static uid_t uid = -1; 395c9a4738SAlan Somers static gid_t gid = -1; 406d203d2dSAlan Somers static int filedesc; 416d203d2dSAlan Somers static struct pollfd fds[1]; 426d203d2dSAlan Somers static mode_t mode = 0777; 436d203d2dSAlan Somers static char extregex[80]; 446d203d2dSAlan Somers static const char *auclass = "fm"; 456d203d2dSAlan Somers static const char *path = "fileforaudit"; 4628845213SAlan Somers static const char *errpath = "adirhasnoname/fileforaudit"; 4728845213SAlan Somers static const char *successreg = "fileforaudit.*return,success"; 4828845213SAlan Somers static const char *failurereg = "fileforaudit.*return,failure"; 496d203d2dSAlan Somers 506d203d2dSAlan Somers 516d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_success); 526d203d2dSAlan Somers ATF_TC_HEAD(flock_success, tc) 536d203d2dSAlan Somers { 546d203d2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 556d203d2dSAlan Somers "flock(2) call"); 566d203d2dSAlan Somers } 576d203d2dSAlan Somers 586d203d2dSAlan Somers ATF_TC_BODY(flock_success, tc) 596d203d2dSAlan Somers { 606d203d2dSAlan Somers pid = getpid(); 616d203d2dSAlan Somers snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid); 626d203d2dSAlan Somers 636d203d2dSAlan Somers /* File needs to exist to call flock(2) */ 646d203d2dSAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 656d203d2dSAlan Somers FILE *pipefd = setup(fds, auclass); 666d203d2dSAlan Somers ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH)); 676d203d2dSAlan Somers check_audit(fds, extregex, pipefd); 686d203d2dSAlan Somers close(filedesc); 696d203d2dSAlan Somers } 706d203d2dSAlan Somers 716d203d2dSAlan Somers ATF_TC_CLEANUP(flock_success, tc) 726d203d2dSAlan Somers { 736d203d2dSAlan Somers cleanup(); 746d203d2dSAlan Somers } 756d203d2dSAlan Somers 766d203d2dSAlan Somers 776d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_failure); 786d203d2dSAlan Somers ATF_TC_HEAD(flock_failure, tc) 796d203d2dSAlan Somers { 806d203d2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 816d203d2dSAlan Somers "flock(2) call"); 826d203d2dSAlan Somers } 836d203d2dSAlan Somers 846d203d2dSAlan Somers ATF_TC_BODY(flock_failure, tc) 856d203d2dSAlan Somers { 866d203d2dSAlan Somers const char *regex = "flock.*return,failure : Bad file descriptor"; 876d203d2dSAlan Somers FILE *pipefd = setup(fds, auclass); 886d203d2dSAlan Somers ATF_REQUIRE_EQ(-1, flock(-1, LOCK_SH)); 896d203d2dSAlan Somers check_audit(fds, regex, pipefd); 906d203d2dSAlan Somers } 916d203d2dSAlan Somers 926d203d2dSAlan Somers ATF_TC_CLEANUP(flock_failure, tc) 936d203d2dSAlan Somers { 946d203d2dSAlan Somers cleanup(); 956d203d2dSAlan Somers } 966d203d2dSAlan Somers 976d203d2dSAlan Somers 986d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_success); 996d203d2dSAlan Somers ATF_TC_HEAD(fcntl_success, tc) 1006d203d2dSAlan Somers { 1016d203d2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 1026d203d2dSAlan Somers "fcntl(2) call"); 1036d203d2dSAlan Somers } 1046d203d2dSAlan Somers 1056d203d2dSAlan Somers ATF_TC_BODY(fcntl_success, tc) 1066d203d2dSAlan Somers { 1076d203d2dSAlan Somers int flagstatus; 1086d203d2dSAlan Somers /* File needs to exist to call fcntl(2) */ 1096d203d2dSAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 1106d203d2dSAlan Somers FILE *pipefd = setup(fds, auclass); 1116d203d2dSAlan Somers 1126d203d2dSAlan Somers /* Retrieve the status flags of 'filedesc' and store it in flagstatus */ 1136d203d2dSAlan Somers ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1); 1146d203d2dSAlan Somers snprintf(extregex, sizeof(extregex), 1156d203d2dSAlan Somers "fcntl.*return,success,%d", flagstatus); 1166d203d2dSAlan Somers check_audit(fds, extregex, pipefd); 1176d203d2dSAlan Somers close(filedesc); 1186d203d2dSAlan Somers } 1196d203d2dSAlan Somers 1206d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_success, tc) 1216d203d2dSAlan Somers { 1226d203d2dSAlan Somers cleanup(); 1236d203d2dSAlan Somers } 1246d203d2dSAlan Somers 1256d203d2dSAlan Somers 1266d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_failure); 1276d203d2dSAlan Somers ATF_TC_HEAD(fcntl_failure, tc) 1286d203d2dSAlan Somers { 1296d203d2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 1306d203d2dSAlan Somers "fcntl(2) call"); 1316d203d2dSAlan Somers } 1326d203d2dSAlan Somers 1336d203d2dSAlan Somers ATF_TC_BODY(fcntl_failure, tc) 1346d203d2dSAlan Somers { 1356d203d2dSAlan Somers const char *regex = "fcntl.*return,failure : Bad file descriptor"; 1366d203d2dSAlan Somers FILE *pipefd = setup(fds, auclass); 1376d203d2dSAlan Somers ATF_REQUIRE_EQ(-1, fcntl(-1, F_GETFL, 0)); 1386d203d2dSAlan Somers check_audit(fds, regex, pipefd); 1396d203d2dSAlan Somers } 1406d203d2dSAlan Somers 1416d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_failure, tc) 1426d203d2dSAlan Somers { 1436d203d2dSAlan Somers cleanup(); 1446d203d2dSAlan Somers } 1456d203d2dSAlan Somers 1466d203d2dSAlan Somers 1476d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_success); 1486d203d2dSAlan Somers ATF_TC_HEAD(fsync_success, tc) 1496d203d2dSAlan Somers { 1506d203d2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 1516d203d2dSAlan Somers "fsync(2) call"); 1526d203d2dSAlan Somers } 1536d203d2dSAlan Somers 1546d203d2dSAlan Somers ATF_TC_BODY(fsync_success, tc) 1556d203d2dSAlan Somers { 1566d203d2dSAlan Somers pid = getpid(); 1576d203d2dSAlan Somers snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid); 1586d203d2dSAlan Somers 1596d203d2dSAlan Somers /* File needs to exist to call fsync(2) */ 1606d203d2dSAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 1616d203d2dSAlan Somers FILE *pipefd = setup(fds, auclass); 1626d203d2dSAlan Somers ATF_REQUIRE_EQ(0, fsync(filedesc)); 1636d203d2dSAlan Somers check_audit(fds, extregex, pipefd); 1646d203d2dSAlan Somers close(filedesc); 1656d203d2dSAlan Somers } 1666d203d2dSAlan Somers 1676d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_success, tc) 1686d203d2dSAlan Somers { 1696d203d2dSAlan Somers cleanup(); 1706d203d2dSAlan Somers } 1716d203d2dSAlan Somers 1726d203d2dSAlan Somers 1736d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_failure); 1746d203d2dSAlan Somers ATF_TC_HEAD(fsync_failure, tc) 1756d203d2dSAlan Somers { 1766d203d2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 1776d203d2dSAlan Somers "fsync(2) call"); 1786d203d2dSAlan Somers } 1796d203d2dSAlan Somers 1806d203d2dSAlan Somers ATF_TC_BODY(fsync_failure, tc) 1816d203d2dSAlan Somers { 1826d203d2dSAlan Somers const char *regex = "fsync.*return,failure : Bad file descriptor"; 1836d203d2dSAlan Somers FILE *pipefd = setup(fds, auclass); 1846d203d2dSAlan Somers /* Failure reason: Invalid file descriptor */ 1856d203d2dSAlan Somers ATF_REQUIRE_EQ(-1, fsync(-1)); 1866d203d2dSAlan Somers check_audit(fds, regex, pipefd); 1876d203d2dSAlan Somers } 1886d203d2dSAlan Somers 1896d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_failure, tc) 1906d203d2dSAlan Somers { 1916d203d2dSAlan Somers cleanup(); 1926d203d2dSAlan Somers } 1936d203d2dSAlan Somers 1946d203d2dSAlan Somers 19528845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_success); 19628845213SAlan Somers ATF_TC_HEAD(chmod_success, tc) 19728845213SAlan Somers { 19828845213SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 19928845213SAlan Somers "chmod(2) call"); 20028845213SAlan Somers } 20128845213SAlan Somers 20228845213SAlan Somers ATF_TC_BODY(chmod_success, tc) 20328845213SAlan Somers { 20428845213SAlan Somers /* File needs to exist to call chmod(2) */ 20528845213SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 20628845213SAlan Somers FILE *pipefd = setup(fds, auclass); 20728845213SAlan Somers ATF_REQUIRE_EQ(0, chmod(path, mode)); 20828845213SAlan Somers check_audit(fds, successreg, pipefd); 20928845213SAlan Somers close(filedesc); 21028845213SAlan Somers } 21128845213SAlan Somers 21228845213SAlan Somers ATF_TC_CLEANUP(chmod_success, tc) 21328845213SAlan Somers { 21428845213SAlan Somers cleanup(); 21528845213SAlan Somers } 21628845213SAlan Somers 21728845213SAlan Somers 21828845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_failure); 21928845213SAlan Somers ATF_TC_HEAD(chmod_failure, tc) 22028845213SAlan Somers { 22128845213SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 22228845213SAlan Somers "chmod(2) call"); 22328845213SAlan Somers } 22428845213SAlan Somers 22528845213SAlan Somers ATF_TC_BODY(chmod_failure, tc) 22628845213SAlan Somers { 22728845213SAlan Somers FILE *pipefd = setup(fds, auclass); 22828845213SAlan Somers /* Failure reason: file does not exist */ 22928845213SAlan Somers ATF_REQUIRE_EQ(-1, chmod(errpath, mode)); 23028845213SAlan Somers check_audit(fds, failurereg, pipefd); 23128845213SAlan Somers } 23228845213SAlan Somers 23328845213SAlan Somers ATF_TC_CLEANUP(chmod_failure, tc) 23428845213SAlan Somers { 23528845213SAlan Somers cleanup(); 23628845213SAlan Somers } 23728845213SAlan Somers 23828845213SAlan Somers 23928845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_success); 24028845213SAlan Somers ATF_TC_HEAD(fchmod_success, tc) 24128845213SAlan Somers { 24228845213SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 24328845213SAlan Somers "fchmod(2) call"); 24428845213SAlan Somers } 24528845213SAlan Somers 24628845213SAlan Somers ATF_TC_BODY(fchmod_success, tc) 24728845213SAlan Somers { 24828845213SAlan Somers pid = getpid(); 24928845213SAlan Somers snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid); 25028845213SAlan Somers 25128845213SAlan Somers /* File needs to exist to call fchmod(2) */ 25228845213SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 25328845213SAlan Somers FILE *pipefd = setup(fds, auclass); 25428845213SAlan Somers ATF_REQUIRE_EQ(0, fchmod(filedesc, mode)); 25528845213SAlan Somers check_audit(fds, extregex, pipefd); 25628845213SAlan Somers close(filedesc); 25728845213SAlan Somers } 25828845213SAlan Somers 25928845213SAlan Somers ATF_TC_CLEANUP(fchmod_success, tc) 26028845213SAlan Somers { 26128845213SAlan Somers cleanup(); 26228845213SAlan Somers } 26328845213SAlan Somers 26428845213SAlan Somers 26528845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_failure); 26628845213SAlan Somers ATF_TC_HEAD(fchmod_failure, tc) 26728845213SAlan Somers { 26828845213SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 26928845213SAlan Somers "fchmod(2) call"); 27028845213SAlan Somers } 27128845213SAlan Somers 27228845213SAlan Somers ATF_TC_BODY(fchmod_failure, tc) 27328845213SAlan Somers { 27428845213SAlan Somers const char *regex = "fchmod.*return,failure : Bad file descriptor"; 27528845213SAlan Somers FILE *pipefd = setup(fds, auclass); 27628845213SAlan Somers /* Failure reason: Invalid file descriptor */ 27728845213SAlan Somers ATF_REQUIRE_EQ(-1, fchmod(-1, mode)); 27828845213SAlan Somers check_audit(fds, regex, pipefd); 27928845213SAlan Somers } 28028845213SAlan Somers 28128845213SAlan Somers ATF_TC_CLEANUP(fchmod_failure, tc) 28228845213SAlan Somers { 28328845213SAlan Somers cleanup(); 28428845213SAlan Somers } 28528845213SAlan Somers 28628845213SAlan Somers 28728845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_success); 28828845213SAlan Somers ATF_TC_HEAD(lchmod_success, tc) 28928845213SAlan Somers { 29028845213SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 29128845213SAlan Somers "lchmod(2) call"); 29228845213SAlan Somers } 29328845213SAlan Somers 29428845213SAlan Somers ATF_TC_BODY(lchmod_success, tc) 29528845213SAlan Somers { 29628845213SAlan Somers /* Symbolic link needs to exist to call lchmod(2) */ 29728845213SAlan Somers ATF_REQUIRE_EQ(0, symlink("symlink", path)); 29828845213SAlan Somers FILE *pipefd = setup(fds, auclass); 29928845213SAlan Somers ATF_REQUIRE_EQ(0, lchmod(path, mode)); 30028845213SAlan Somers check_audit(fds, successreg, pipefd); 30128845213SAlan Somers } 30228845213SAlan Somers 30328845213SAlan Somers ATF_TC_CLEANUP(lchmod_success, tc) 30428845213SAlan Somers { 30528845213SAlan Somers cleanup(); 30628845213SAlan Somers } 30728845213SAlan Somers 30828845213SAlan Somers 30928845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_failure); 31028845213SAlan Somers ATF_TC_HEAD(lchmod_failure, tc) 31128845213SAlan Somers { 31228845213SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 31328845213SAlan Somers "lchmod(2) call"); 31428845213SAlan Somers } 31528845213SAlan Somers 31628845213SAlan Somers ATF_TC_BODY(lchmod_failure, tc) 31728845213SAlan Somers { 31828845213SAlan Somers FILE *pipefd = setup(fds, auclass); 31928845213SAlan Somers /* Failure reason: file does not exist */ 32028845213SAlan Somers ATF_REQUIRE_EQ(-1, lchmod(errpath, mode)); 32128845213SAlan Somers check_audit(fds, failurereg, pipefd); 32228845213SAlan Somers } 32328845213SAlan Somers 32428845213SAlan Somers ATF_TC_CLEANUP(lchmod_failure, tc) 32528845213SAlan Somers { 32628845213SAlan Somers cleanup(); 32728845213SAlan Somers } 32828845213SAlan Somers 32928845213SAlan Somers 33028845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_success); 33128845213SAlan Somers ATF_TC_HEAD(fchmodat_success, tc) 33228845213SAlan Somers { 33328845213SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 33428845213SAlan Somers "fchmodat(2) call"); 33528845213SAlan Somers } 33628845213SAlan Somers 33728845213SAlan Somers ATF_TC_BODY(fchmodat_success, tc) 33828845213SAlan Somers { 33928845213SAlan Somers /* File needs to exist to call fchmodat(2) */ 34028845213SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 34128845213SAlan Somers FILE *pipefd = setup(fds, auclass); 34228845213SAlan Somers ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0)); 34328845213SAlan Somers check_audit(fds, successreg, pipefd); 34428845213SAlan Somers close(filedesc); 34528845213SAlan Somers } 34628845213SAlan Somers 34728845213SAlan Somers ATF_TC_CLEANUP(fchmodat_success, tc) 34828845213SAlan Somers { 34928845213SAlan Somers cleanup(); 35028845213SAlan Somers } 35128845213SAlan Somers 35228845213SAlan Somers 35328845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_failure); 35428845213SAlan Somers ATF_TC_HEAD(fchmodat_failure, tc) 35528845213SAlan Somers { 35628845213SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 35728845213SAlan Somers "fchmodat(2) call"); 35828845213SAlan Somers } 35928845213SAlan Somers 36028845213SAlan Somers ATF_TC_BODY(fchmodat_failure, tc) 36128845213SAlan Somers { 36228845213SAlan Somers FILE *pipefd = setup(fds, auclass); 36328845213SAlan Somers /* Failure reason: file does not exist */ 36428845213SAlan Somers ATF_REQUIRE_EQ(-1, fchmodat(AT_FDCWD, errpath, mode, 0)); 36528845213SAlan Somers check_audit(fds, failurereg, pipefd); 36628845213SAlan Somers } 36728845213SAlan Somers 36828845213SAlan Somers ATF_TC_CLEANUP(fchmodat_failure, tc) 36928845213SAlan Somers { 37028845213SAlan Somers cleanup(); 37128845213SAlan Somers } 37228845213SAlan Somers 37328845213SAlan Somers 3745c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_success); 3755c9a4738SAlan Somers ATF_TC_HEAD(chown_success, tc) 3765c9a4738SAlan Somers { 3775c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 3785c9a4738SAlan Somers "chown(2) call"); 3795c9a4738SAlan Somers } 3805c9a4738SAlan Somers 3815c9a4738SAlan Somers ATF_TC_BODY(chown_success, tc) 3825c9a4738SAlan Somers { 3835c9a4738SAlan Somers /* File needs to exist to call chown(2) */ 3845c9a4738SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 3855c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 3865c9a4738SAlan Somers ATF_REQUIRE_EQ(0, chown(path, uid, gid)); 3875c9a4738SAlan Somers check_audit(fds, successreg, pipefd); 3885c9a4738SAlan Somers close(filedesc); 3895c9a4738SAlan Somers } 3905c9a4738SAlan Somers 3915c9a4738SAlan Somers ATF_TC_CLEANUP(chown_success, tc) 3925c9a4738SAlan Somers { 3935c9a4738SAlan Somers cleanup(); 3945c9a4738SAlan Somers } 3955c9a4738SAlan Somers 3965c9a4738SAlan Somers 3975c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_failure); 3985c9a4738SAlan Somers ATF_TC_HEAD(chown_failure, tc) 3995c9a4738SAlan Somers { 4005c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 4015c9a4738SAlan Somers "chown(2) call"); 4025c9a4738SAlan Somers } 4035c9a4738SAlan Somers 4045c9a4738SAlan Somers ATF_TC_BODY(chown_failure, tc) 4055c9a4738SAlan Somers { 4065c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 4075c9a4738SAlan Somers /* Failure reason: file does not exist */ 4085c9a4738SAlan Somers ATF_REQUIRE_EQ(-1, chown(errpath, uid, gid)); 4095c9a4738SAlan Somers check_audit(fds, failurereg, pipefd); 4105c9a4738SAlan Somers } 4115c9a4738SAlan Somers 4125c9a4738SAlan Somers ATF_TC_CLEANUP(chown_failure, tc) 4135c9a4738SAlan Somers { 4145c9a4738SAlan Somers cleanup(); 4155c9a4738SAlan Somers } 4165c9a4738SAlan Somers 4175c9a4738SAlan Somers 4185c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_success); 4195c9a4738SAlan Somers ATF_TC_HEAD(fchown_success, tc) 4205c9a4738SAlan Somers { 4215c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 4225c9a4738SAlan Somers "fchown(2) call"); 4235c9a4738SAlan Somers } 4245c9a4738SAlan Somers 4255c9a4738SAlan Somers ATF_TC_BODY(fchown_success, tc) 4265c9a4738SAlan Somers { 4275c9a4738SAlan Somers pid = getpid(); 4285c9a4738SAlan Somers snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid); 4295c9a4738SAlan Somers 4305c9a4738SAlan Somers /* File needs to exist to call fchown(2) */ 4315c9a4738SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 4325c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 4335c9a4738SAlan Somers ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid)); 4345c9a4738SAlan Somers check_audit(fds, extregex, pipefd); 4355c9a4738SAlan Somers close(filedesc); 4365c9a4738SAlan Somers } 4375c9a4738SAlan Somers 4385c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_success, tc) 4395c9a4738SAlan Somers { 4405c9a4738SAlan Somers cleanup(); 4415c9a4738SAlan Somers } 4425c9a4738SAlan Somers 4435c9a4738SAlan Somers 4445c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_failure); 4455c9a4738SAlan Somers ATF_TC_HEAD(fchown_failure, tc) 4465c9a4738SAlan Somers { 4475c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 4485c9a4738SAlan Somers "fchown(2) call"); 4495c9a4738SAlan Somers } 4505c9a4738SAlan Somers 4515c9a4738SAlan Somers ATF_TC_BODY(fchown_failure, tc) 4525c9a4738SAlan Somers { 4535c9a4738SAlan Somers const char *regex = "fchown.*return,failure : Bad file descriptor"; 4545c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 4555c9a4738SAlan Somers /* Failure reason: Invalid file descriptor */ 4565c9a4738SAlan Somers ATF_REQUIRE_EQ(-1, fchown(-1, uid, gid)); 4575c9a4738SAlan Somers check_audit(fds, regex, pipefd); 4585c9a4738SAlan Somers } 4595c9a4738SAlan Somers 4605c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_failure, tc) 4615c9a4738SAlan Somers { 4625c9a4738SAlan Somers cleanup(); 4635c9a4738SAlan Somers } 4645c9a4738SAlan Somers 4655c9a4738SAlan Somers 4665c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_success); 4675c9a4738SAlan Somers ATF_TC_HEAD(lchown_success, tc) 4685c9a4738SAlan Somers { 4695c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 4705c9a4738SAlan Somers "lchown(2) call"); 4715c9a4738SAlan Somers } 4725c9a4738SAlan Somers 4735c9a4738SAlan Somers ATF_TC_BODY(lchown_success, tc) 4745c9a4738SAlan Somers { 4755c9a4738SAlan Somers /* Symbolic link needs to exist to call lchown(2) */ 4765c9a4738SAlan Somers ATF_REQUIRE_EQ(0, symlink("symlink", path)); 4775c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 4785c9a4738SAlan Somers ATF_REQUIRE_EQ(0, lchown(path, uid, gid)); 4795c9a4738SAlan Somers check_audit(fds, successreg, pipefd); 4805c9a4738SAlan Somers } 4815c9a4738SAlan Somers 4825c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_success, tc) 4835c9a4738SAlan Somers { 4845c9a4738SAlan Somers cleanup(); 4855c9a4738SAlan Somers } 4865c9a4738SAlan Somers 4875c9a4738SAlan Somers 4885c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_failure); 4895c9a4738SAlan Somers ATF_TC_HEAD(lchown_failure, tc) 4905c9a4738SAlan Somers { 4915c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 4925c9a4738SAlan Somers "lchown(2) call"); 4935c9a4738SAlan Somers } 4945c9a4738SAlan Somers 4955c9a4738SAlan Somers ATF_TC_BODY(lchown_failure, tc) 4965c9a4738SAlan Somers { 4975c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 4985c9a4738SAlan Somers /* Failure reason: Symbolic link does not exist */ 4995c9a4738SAlan Somers ATF_REQUIRE_EQ(-1, lchown(errpath, uid, gid)); 5005c9a4738SAlan Somers check_audit(fds, failurereg, pipefd); 5015c9a4738SAlan Somers } 5025c9a4738SAlan Somers 5035c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_failure, tc) 5045c9a4738SAlan Somers { 5055c9a4738SAlan Somers cleanup(); 5065c9a4738SAlan Somers } 5075c9a4738SAlan Somers 5085c9a4738SAlan Somers 5095c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_success); 5105c9a4738SAlan Somers ATF_TC_HEAD(fchownat_success, tc) 5115c9a4738SAlan Somers { 5125c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 5135c9a4738SAlan Somers "fchownat(2) call"); 5145c9a4738SAlan Somers } 5155c9a4738SAlan Somers 5165c9a4738SAlan Somers ATF_TC_BODY(fchownat_success, tc) 5175c9a4738SAlan Somers { 5185c9a4738SAlan Somers /* File needs to exist to call fchownat(2) */ 5195c9a4738SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 5205c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 5215c9a4738SAlan Somers ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0)); 5225c9a4738SAlan Somers check_audit(fds, successreg, pipefd); 5235c9a4738SAlan Somers close(filedesc); 5245c9a4738SAlan Somers } 5255c9a4738SAlan Somers 5265c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_success, tc) 5275c9a4738SAlan Somers { 5285c9a4738SAlan Somers cleanup(); 5295c9a4738SAlan Somers } 5305c9a4738SAlan Somers 5315c9a4738SAlan Somers 5325c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_failure); 5335c9a4738SAlan Somers ATF_TC_HEAD(fchownat_failure, tc) 5345c9a4738SAlan Somers { 5355c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 5365c9a4738SAlan Somers "fchownat(2) call"); 5375c9a4738SAlan Somers } 5385c9a4738SAlan Somers 5395c9a4738SAlan Somers ATF_TC_BODY(fchownat_failure, tc) 5405c9a4738SAlan Somers { 5415c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 5425c9a4738SAlan Somers /* Failure reason: file does not exist */ 5435c9a4738SAlan Somers ATF_REQUIRE_EQ(-1, fchownat(AT_FDCWD, errpath, uid, gid, 0)); 5445c9a4738SAlan Somers check_audit(fds, failurereg, pipefd); 5455c9a4738SAlan Somers } 5465c9a4738SAlan Somers 5475c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_failure, tc) 5485c9a4738SAlan Somers { 5495c9a4738SAlan Somers cleanup(); 5505c9a4738SAlan Somers } 5515c9a4738SAlan Somers 5525c9a4738SAlan Somers 553*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(chflags_success); 554*68e520feSAlan Somers ATF_TC_HEAD(chflags_success, tc) 555*68e520feSAlan Somers { 556*68e520feSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 557*68e520feSAlan Somers "chflags(2) call"); 558*68e520feSAlan Somers } 559*68e520feSAlan Somers 560*68e520feSAlan Somers ATF_TC_BODY(chflags_success, tc) 561*68e520feSAlan Somers { 562*68e520feSAlan Somers /* File needs to exist to call chflags(2) */ 563*68e520feSAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 564*68e520feSAlan Somers FILE *pipefd = setup(fds, auclass); 565*68e520feSAlan Somers ATF_REQUIRE_EQ(0, chflags(path, UF_OFFLINE)); 566*68e520feSAlan Somers check_audit(fds, successreg, pipefd); 567*68e520feSAlan Somers close(filedesc); 568*68e520feSAlan Somers } 569*68e520feSAlan Somers 570*68e520feSAlan Somers ATF_TC_CLEANUP(chflags_success, tc) 571*68e520feSAlan Somers { 572*68e520feSAlan Somers cleanup(); 573*68e520feSAlan Somers } 574*68e520feSAlan Somers 575*68e520feSAlan Somers 576*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(chflags_failure); 577*68e520feSAlan Somers ATF_TC_HEAD(chflags_failure, tc) 578*68e520feSAlan Somers { 579*68e520feSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 580*68e520feSAlan Somers "chflags(2) call"); 581*68e520feSAlan Somers } 582*68e520feSAlan Somers 583*68e520feSAlan Somers ATF_TC_BODY(chflags_failure, tc) 584*68e520feSAlan Somers { 585*68e520feSAlan Somers FILE *pipefd = setup(fds, auclass); 586*68e520feSAlan Somers /* Failure reason: file does not exist */ 587*68e520feSAlan Somers ATF_REQUIRE_EQ(-1, chflags(errpath, UF_OFFLINE)); 588*68e520feSAlan Somers check_audit(fds, failurereg, pipefd); 589*68e520feSAlan Somers } 590*68e520feSAlan Somers 591*68e520feSAlan Somers ATF_TC_CLEANUP(chflags_failure, tc) 592*68e520feSAlan Somers { 593*68e520feSAlan Somers cleanup(); 594*68e520feSAlan Somers } 595*68e520feSAlan Somers 596*68e520feSAlan Somers 597*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(fchflags_success); 598*68e520feSAlan Somers ATF_TC_HEAD(fchflags_success, tc) 599*68e520feSAlan Somers { 600*68e520feSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 601*68e520feSAlan Somers "fchflags(2) call"); 602*68e520feSAlan Somers } 603*68e520feSAlan Somers 604*68e520feSAlan Somers ATF_TC_BODY(fchflags_success, tc) 605*68e520feSAlan Somers { 606*68e520feSAlan Somers pid = getpid(); 607*68e520feSAlan Somers snprintf(extregex, sizeof(extregex), "fchflags.*%d.*ret.*success", pid); 608*68e520feSAlan Somers /* File needs to exist to call fchflags(2) */ 609*68e520feSAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 610*68e520feSAlan Somers 611*68e520feSAlan Somers FILE *pipefd = setup(fds, auclass); 612*68e520feSAlan Somers ATF_REQUIRE_EQ(0, fchflags(filedesc, UF_OFFLINE)); 613*68e520feSAlan Somers check_audit(fds, extregex, pipefd); 614*68e520feSAlan Somers close(filedesc); 615*68e520feSAlan Somers } 616*68e520feSAlan Somers 617*68e520feSAlan Somers ATF_TC_CLEANUP(fchflags_success, tc) 618*68e520feSAlan Somers { 619*68e520feSAlan Somers cleanup(); 620*68e520feSAlan Somers } 621*68e520feSAlan Somers 622*68e520feSAlan Somers 623*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(fchflags_failure); 624*68e520feSAlan Somers ATF_TC_HEAD(fchflags_failure, tc) 625*68e520feSAlan Somers { 626*68e520feSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 627*68e520feSAlan Somers "fchflags(2) call"); 628*68e520feSAlan Somers } 629*68e520feSAlan Somers 630*68e520feSAlan Somers ATF_TC_BODY(fchflags_failure, tc) 631*68e520feSAlan Somers { 632*68e520feSAlan Somers const char *regex = "fchflags.*return,failure : Bad file descriptor"; 633*68e520feSAlan Somers FILE *pipefd = setup(fds, auclass); 634*68e520feSAlan Somers /* Failure reason: Invalid file descriptor */ 635*68e520feSAlan Somers ATF_REQUIRE_EQ(-1, fchflags(-1, UF_OFFLINE)); 636*68e520feSAlan Somers check_audit(fds, regex, pipefd); 637*68e520feSAlan Somers } 638*68e520feSAlan Somers 639*68e520feSAlan Somers ATF_TC_CLEANUP(fchflags_failure, tc) 640*68e520feSAlan Somers { 641*68e520feSAlan Somers cleanup(); 642*68e520feSAlan Somers } 643*68e520feSAlan Somers 644*68e520feSAlan Somers 645*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(lchflags_success); 646*68e520feSAlan Somers ATF_TC_HEAD(lchflags_success, tc) 647*68e520feSAlan Somers { 648*68e520feSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 649*68e520feSAlan Somers "lchflags(2) call"); 650*68e520feSAlan Somers } 651*68e520feSAlan Somers 652*68e520feSAlan Somers ATF_TC_BODY(lchflags_success, tc) 653*68e520feSAlan Somers { 654*68e520feSAlan Somers /* Symbolic link needs to exist to call lchflags(2) */ 655*68e520feSAlan Somers ATF_REQUIRE_EQ(0, symlink("symlink", path)); 656*68e520feSAlan Somers FILE *pipefd = setup(fds, auclass); 657*68e520feSAlan Somers ATF_REQUIRE_EQ(0, lchflags(path, UF_OFFLINE)); 658*68e520feSAlan Somers check_audit(fds, successreg, pipefd); 659*68e520feSAlan Somers } 660*68e520feSAlan Somers 661*68e520feSAlan Somers ATF_TC_CLEANUP(lchflags_success, tc) 662*68e520feSAlan Somers { 663*68e520feSAlan Somers cleanup(); 664*68e520feSAlan Somers } 665*68e520feSAlan Somers 666*68e520feSAlan Somers 667*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(lchflags_failure); 668*68e520feSAlan Somers ATF_TC_HEAD(lchflags_failure, tc) 669*68e520feSAlan Somers { 670*68e520feSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 671*68e520feSAlan Somers "lchflags(2) call"); 672*68e520feSAlan Somers } 673*68e520feSAlan Somers 674*68e520feSAlan Somers ATF_TC_BODY(lchflags_failure, tc) 675*68e520feSAlan Somers { 676*68e520feSAlan Somers FILE *pipefd = setup(fds, auclass); 677*68e520feSAlan Somers /* Failure reason: Symbolic link does not exist */ 678*68e520feSAlan Somers ATF_REQUIRE_EQ(-1, lchflags(errpath, UF_OFFLINE)); 679*68e520feSAlan Somers check_audit(fds, failurereg, pipefd); 680*68e520feSAlan Somers } 681*68e520feSAlan Somers 682*68e520feSAlan Somers ATF_TC_CLEANUP(lchflags_failure, tc) 683*68e520feSAlan Somers { 684*68e520feSAlan Somers cleanup(); 685*68e520feSAlan Somers } 686*68e520feSAlan Somers 687*68e520feSAlan Somers 6886d203d2dSAlan Somers ATF_TP_ADD_TCS(tp) 6896d203d2dSAlan Somers { 6906d203d2dSAlan Somers ATF_TP_ADD_TC(tp, flock_success); 6916d203d2dSAlan Somers ATF_TP_ADD_TC(tp, flock_failure); 6926d203d2dSAlan Somers ATF_TP_ADD_TC(tp, fcntl_success); 6936d203d2dSAlan Somers ATF_TP_ADD_TC(tp, fcntl_failure); 6946d203d2dSAlan Somers ATF_TP_ADD_TC(tp, fsync_success); 6956d203d2dSAlan Somers ATF_TP_ADD_TC(tp, fsync_failure); 6966d203d2dSAlan Somers 69728845213SAlan Somers ATF_TP_ADD_TC(tp, chmod_success); 69828845213SAlan Somers ATF_TP_ADD_TC(tp, chmod_failure); 69928845213SAlan Somers ATF_TP_ADD_TC(tp, fchmod_success); 70028845213SAlan Somers ATF_TP_ADD_TC(tp, fchmod_failure); 70128845213SAlan Somers ATF_TP_ADD_TC(tp, lchmod_success); 70228845213SAlan Somers ATF_TP_ADD_TC(tp, lchmod_failure); 70328845213SAlan Somers ATF_TP_ADD_TC(tp, fchmodat_success); 70428845213SAlan Somers ATF_TP_ADD_TC(tp, fchmodat_failure); 70528845213SAlan Somers 7065c9a4738SAlan Somers ATF_TP_ADD_TC(tp, chown_success); 7075c9a4738SAlan Somers ATF_TP_ADD_TC(tp, chown_failure); 7085c9a4738SAlan Somers ATF_TP_ADD_TC(tp, fchown_success); 7095c9a4738SAlan Somers ATF_TP_ADD_TC(tp, fchown_failure); 7105c9a4738SAlan Somers ATF_TP_ADD_TC(tp, lchown_success); 7115c9a4738SAlan Somers ATF_TP_ADD_TC(tp, lchown_failure); 7125c9a4738SAlan Somers ATF_TP_ADD_TC(tp, fchownat_success); 7135c9a4738SAlan Somers ATF_TP_ADD_TC(tp, fchownat_failure); 7145c9a4738SAlan Somers 715*68e520feSAlan Somers ATF_TP_ADD_TC(tp, chflags_success); 716*68e520feSAlan Somers ATF_TP_ADD_TC(tp, chflags_failure); 717*68e520feSAlan Somers ATF_TP_ADD_TC(tp, fchflags_success); 718*68e520feSAlan Somers ATF_TP_ADD_TC(tp, fchflags_failure); 719*68e520feSAlan Somers ATF_TP_ADD_TC(tp, lchflags_success); 720*68e520feSAlan Somers ATF_TP_ADD_TC(tp, lchflags_failure); 721*68e520feSAlan Somers 7226d203d2dSAlan Somers return (atf_no_error()); 7236d203d2dSAlan Somers } 724