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; 38*5c9a4738SAlan Somers static uid_t uid = -1; 39*5c9a4738SAlan 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 374*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_success); 375*5c9a4738SAlan Somers ATF_TC_HEAD(chown_success, tc) 376*5c9a4738SAlan Somers { 377*5c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 378*5c9a4738SAlan Somers "chown(2) call"); 379*5c9a4738SAlan Somers } 380*5c9a4738SAlan Somers 381*5c9a4738SAlan Somers ATF_TC_BODY(chown_success, tc) 382*5c9a4738SAlan Somers { 383*5c9a4738SAlan Somers /* File needs to exist to call chown(2) */ 384*5c9a4738SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 385*5c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 386*5c9a4738SAlan Somers ATF_REQUIRE_EQ(0, chown(path, uid, gid)); 387*5c9a4738SAlan Somers check_audit(fds, successreg, pipefd); 388*5c9a4738SAlan Somers close(filedesc); 389*5c9a4738SAlan Somers } 390*5c9a4738SAlan Somers 391*5c9a4738SAlan Somers ATF_TC_CLEANUP(chown_success, tc) 392*5c9a4738SAlan Somers { 393*5c9a4738SAlan Somers cleanup(); 394*5c9a4738SAlan Somers } 395*5c9a4738SAlan Somers 396*5c9a4738SAlan Somers 397*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_failure); 398*5c9a4738SAlan Somers ATF_TC_HEAD(chown_failure, tc) 399*5c9a4738SAlan Somers { 400*5c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 401*5c9a4738SAlan Somers "chown(2) call"); 402*5c9a4738SAlan Somers } 403*5c9a4738SAlan Somers 404*5c9a4738SAlan Somers ATF_TC_BODY(chown_failure, tc) 405*5c9a4738SAlan Somers { 406*5c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 407*5c9a4738SAlan Somers /* Failure reason: file does not exist */ 408*5c9a4738SAlan Somers ATF_REQUIRE_EQ(-1, chown(errpath, uid, gid)); 409*5c9a4738SAlan Somers check_audit(fds, failurereg, pipefd); 410*5c9a4738SAlan Somers } 411*5c9a4738SAlan Somers 412*5c9a4738SAlan Somers ATF_TC_CLEANUP(chown_failure, tc) 413*5c9a4738SAlan Somers { 414*5c9a4738SAlan Somers cleanup(); 415*5c9a4738SAlan Somers } 416*5c9a4738SAlan Somers 417*5c9a4738SAlan Somers 418*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_success); 419*5c9a4738SAlan Somers ATF_TC_HEAD(fchown_success, tc) 420*5c9a4738SAlan Somers { 421*5c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 422*5c9a4738SAlan Somers "fchown(2) call"); 423*5c9a4738SAlan Somers } 424*5c9a4738SAlan Somers 425*5c9a4738SAlan Somers ATF_TC_BODY(fchown_success, tc) 426*5c9a4738SAlan Somers { 427*5c9a4738SAlan Somers pid = getpid(); 428*5c9a4738SAlan Somers snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid); 429*5c9a4738SAlan Somers 430*5c9a4738SAlan Somers /* File needs to exist to call fchown(2) */ 431*5c9a4738SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 432*5c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 433*5c9a4738SAlan Somers ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid)); 434*5c9a4738SAlan Somers check_audit(fds, extregex, pipefd); 435*5c9a4738SAlan Somers close(filedesc); 436*5c9a4738SAlan Somers } 437*5c9a4738SAlan Somers 438*5c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_success, tc) 439*5c9a4738SAlan Somers { 440*5c9a4738SAlan Somers cleanup(); 441*5c9a4738SAlan Somers } 442*5c9a4738SAlan Somers 443*5c9a4738SAlan Somers 444*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_failure); 445*5c9a4738SAlan Somers ATF_TC_HEAD(fchown_failure, tc) 446*5c9a4738SAlan Somers { 447*5c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 448*5c9a4738SAlan Somers "fchown(2) call"); 449*5c9a4738SAlan Somers } 450*5c9a4738SAlan Somers 451*5c9a4738SAlan Somers ATF_TC_BODY(fchown_failure, tc) 452*5c9a4738SAlan Somers { 453*5c9a4738SAlan Somers const char *regex = "fchown.*return,failure : Bad file descriptor"; 454*5c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 455*5c9a4738SAlan Somers /* Failure reason: Invalid file descriptor */ 456*5c9a4738SAlan Somers ATF_REQUIRE_EQ(-1, fchown(-1, uid, gid)); 457*5c9a4738SAlan Somers check_audit(fds, regex, pipefd); 458*5c9a4738SAlan Somers } 459*5c9a4738SAlan Somers 460*5c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_failure, tc) 461*5c9a4738SAlan Somers { 462*5c9a4738SAlan Somers cleanup(); 463*5c9a4738SAlan Somers } 464*5c9a4738SAlan Somers 465*5c9a4738SAlan Somers 466*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_success); 467*5c9a4738SAlan Somers ATF_TC_HEAD(lchown_success, tc) 468*5c9a4738SAlan Somers { 469*5c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 470*5c9a4738SAlan Somers "lchown(2) call"); 471*5c9a4738SAlan Somers } 472*5c9a4738SAlan Somers 473*5c9a4738SAlan Somers ATF_TC_BODY(lchown_success, tc) 474*5c9a4738SAlan Somers { 475*5c9a4738SAlan Somers /* Symbolic link needs to exist to call lchown(2) */ 476*5c9a4738SAlan Somers ATF_REQUIRE_EQ(0, symlink("symlink", path)); 477*5c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 478*5c9a4738SAlan Somers ATF_REQUIRE_EQ(0, lchown(path, uid, gid)); 479*5c9a4738SAlan Somers check_audit(fds, successreg, pipefd); 480*5c9a4738SAlan Somers } 481*5c9a4738SAlan Somers 482*5c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_success, tc) 483*5c9a4738SAlan Somers { 484*5c9a4738SAlan Somers cleanup(); 485*5c9a4738SAlan Somers } 486*5c9a4738SAlan Somers 487*5c9a4738SAlan Somers 488*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_failure); 489*5c9a4738SAlan Somers ATF_TC_HEAD(lchown_failure, tc) 490*5c9a4738SAlan Somers { 491*5c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 492*5c9a4738SAlan Somers "lchown(2) call"); 493*5c9a4738SAlan Somers } 494*5c9a4738SAlan Somers 495*5c9a4738SAlan Somers ATF_TC_BODY(lchown_failure, tc) 496*5c9a4738SAlan Somers { 497*5c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 498*5c9a4738SAlan Somers /* Failure reason: Symbolic link does not exist */ 499*5c9a4738SAlan Somers ATF_REQUIRE_EQ(-1, lchown(errpath, uid, gid)); 500*5c9a4738SAlan Somers check_audit(fds, failurereg, pipefd); 501*5c9a4738SAlan Somers } 502*5c9a4738SAlan Somers 503*5c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_failure, tc) 504*5c9a4738SAlan Somers { 505*5c9a4738SAlan Somers cleanup(); 506*5c9a4738SAlan Somers } 507*5c9a4738SAlan Somers 508*5c9a4738SAlan Somers 509*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_success); 510*5c9a4738SAlan Somers ATF_TC_HEAD(fchownat_success, tc) 511*5c9a4738SAlan Somers { 512*5c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 513*5c9a4738SAlan Somers "fchownat(2) call"); 514*5c9a4738SAlan Somers } 515*5c9a4738SAlan Somers 516*5c9a4738SAlan Somers ATF_TC_BODY(fchownat_success, tc) 517*5c9a4738SAlan Somers { 518*5c9a4738SAlan Somers /* File needs to exist to call fchownat(2) */ 519*5c9a4738SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 520*5c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 521*5c9a4738SAlan Somers ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0)); 522*5c9a4738SAlan Somers check_audit(fds, successreg, pipefd); 523*5c9a4738SAlan Somers close(filedesc); 524*5c9a4738SAlan Somers } 525*5c9a4738SAlan Somers 526*5c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_success, tc) 527*5c9a4738SAlan Somers { 528*5c9a4738SAlan Somers cleanup(); 529*5c9a4738SAlan Somers } 530*5c9a4738SAlan Somers 531*5c9a4738SAlan Somers 532*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_failure); 533*5c9a4738SAlan Somers ATF_TC_HEAD(fchownat_failure, tc) 534*5c9a4738SAlan Somers { 535*5c9a4738SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 536*5c9a4738SAlan Somers "fchownat(2) call"); 537*5c9a4738SAlan Somers } 538*5c9a4738SAlan Somers 539*5c9a4738SAlan Somers ATF_TC_BODY(fchownat_failure, tc) 540*5c9a4738SAlan Somers { 541*5c9a4738SAlan Somers FILE *pipefd = setup(fds, auclass); 542*5c9a4738SAlan Somers /* Failure reason: file does not exist */ 543*5c9a4738SAlan Somers ATF_REQUIRE_EQ(-1, fchownat(AT_FDCWD, errpath, uid, gid, 0)); 544*5c9a4738SAlan Somers check_audit(fds, failurereg, pipefd); 545*5c9a4738SAlan Somers } 546*5c9a4738SAlan Somers 547*5c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_failure, tc) 548*5c9a4738SAlan Somers { 549*5c9a4738SAlan Somers cleanup(); 550*5c9a4738SAlan Somers } 551*5c9a4738SAlan Somers 552*5c9a4738SAlan Somers 5536d203d2dSAlan Somers ATF_TP_ADD_TCS(tp) 5546d203d2dSAlan Somers { 5556d203d2dSAlan Somers ATF_TP_ADD_TC(tp, flock_success); 5566d203d2dSAlan Somers ATF_TP_ADD_TC(tp, flock_failure); 5576d203d2dSAlan Somers ATF_TP_ADD_TC(tp, fcntl_success); 5586d203d2dSAlan Somers ATF_TP_ADD_TC(tp, fcntl_failure); 5596d203d2dSAlan Somers ATF_TP_ADD_TC(tp, fsync_success); 5606d203d2dSAlan Somers ATF_TP_ADD_TC(tp, fsync_failure); 5616d203d2dSAlan Somers 56228845213SAlan Somers ATF_TP_ADD_TC(tp, chmod_success); 56328845213SAlan Somers ATF_TP_ADD_TC(tp, chmod_failure); 56428845213SAlan Somers ATF_TP_ADD_TC(tp, fchmod_success); 56528845213SAlan Somers ATF_TP_ADD_TC(tp, fchmod_failure); 56628845213SAlan Somers ATF_TP_ADD_TC(tp, lchmod_success); 56728845213SAlan Somers ATF_TP_ADD_TC(tp, lchmod_failure); 56828845213SAlan Somers ATF_TP_ADD_TC(tp, fchmodat_success); 56928845213SAlan Somers ATF_TP_ADD_TC(tp, fchmodat_failure); 57028845213SAlan Somers 571*5c9a4738SAlan Somers ATF_TP_ADD_TC(tp, chown_success); 572*5c9a4738SAlan Somers ATF_TP_ADD_TC(tp, chown_failure); 573*5c9a4738SAlan Somers ATF_TP_ADD_TC(tp, fchown_success); 574*5c9a4738SAlan Somers ATF_TP_ADD_TC(tp, fchown_failure); 575*5c9a4738SAlan Somers ATF_TP_ADD_TC(tp, lchown_success); 576*5c9a4738SAlan Somers ATF_TP_ADD_TC(tp, lchown_failure); 577*5c9a4738SAlan Somers ATF_TP_ADD_TC(tp, fchownat_success); 578*5c9a4738SAlan Somers ATF_TP_ADD_TC(tp, fchownat_failure); 579*5c9a4738SAlan Somers 5806d203d2dSAlan Somers return (atf_no_error()); 5816d203d2dSAlan Somers } 582