1f86d6517SAlan Somers /*- 2f86d6517SAlan Somers * Copyright (c) 2018 Aniket Pandey 3f86d6517SAlan Somers * 4f86d6517SAlan Somers * Redistribution and use in source and binary forms, with or without 5f86d6517SAlan Somers * modification, are permitted provided that the following conditions 6f86d6517SAlan Somers * are met: 7f86d6517SAlan Somers * 1. Redistributions of source code must retain the above copyright 8f86d6517SAlan Somers * notice, this list of conditions and the following disclaimer. 9f86d6517SAlan Somers * 2. Redistributions in binary form must reproduce the above copyright 10f86d6517SAlan Somers * notice, this list of conditions and the following disclaimer in the 11f86d6517SAlan Somers * documentation and/or other materials provided with the distribution. 12f86d6517SAlan Somers * 13f86d6517SAlan Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14f86d6517SAlan Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15f86d6517SAlan Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16f86d6517SAlan Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17f86d6517SAlan Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18f86d6517SAlan Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19f86d6517SAlan Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 20f86d6517SAlan Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21f86d6517SAlan Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22f86d6517SAlan Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23f86d6517SAlan Somers * SUCH DAMAGE. 24f86d6517SAlan Somers * 25f86d6517SAlan Somers * $FreeBSD$ 26f86d6517SAlan Somers */ 27f86d6517SAlan Somers 28f86d6517SAlan Somers #include <sys/stat.h> 29f86d6517SAlan Somers #include <sys/syscall.h> 30f86d6517SAlan Somers 31f86d6517SAlan Somers #include <atf-c.h> 32f86d6517SAlan Somers #include <fcntl.h> 33f86d6517SAlan Somers #include <unistd.h> 34f86d6517SAlan Somers 35f86d6517SAlan Somers #include "utils.h" 36f86d6517SAlan Somers 37f86d6517SAlan Somers static struct pollfd fds[1]; 38f86d6517SAlan Somers static mode_t mode = 0777; 39*b13a70d5SAlan Somers static int filedesc; 40f86d6517SAlan Somers static char extregex[80]; 41f86d6517SAlan Somers static struct stat statbuff; 42f86d6517SAlan Somers static const char *auclass = "fa"; 43f86d6517SAlan Somers static const char *path = "fileforaudit"; 44f86d6517SAlan Somers static const char *errpath = "dirdoesnotexist/fileforaudit"; 45f86d6517SAlan Somers static const char *successreg = "fileforaudit.*return,success"; 46f86d6517SAlan Somers static const char *failurereg = "fileforaudit.*return,failure"; 47f86d6517SAlan Somers 48f86d6517SAlan Somers 49f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(stat_success); 50f86d6517SAlan Somers ATF_TC_HEAD(stat_success, tc) 51f86d6517SAlan Somers { 52f86d6517SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 53f86d6517SAlan Somers "stat(2) call"); 54f86d6517SAlan Somers } 55f86d6517SAlan Somers 56f86d6517SAlan Somers ATF_TC_BODY(stat_success, tc) 57f86d6517SAlan Somers { 58f86d6517SAlan Somers /* File needs to exist to call stat(2) */ 59*b13a70d5SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1); 60f86d6517SAlan Somers FILE *pipefd = setup(fds, auclass); 61f86d6517SAlan Somers ATF_REQUIRE_EQ(0, stat(path, &statbuff)); 62f86d6517SAlan Somers check_audit(fds, successreg, pipefd); 63*b13a70d5SAlan Somers close(filedesc); 64f86d6517SAlan Somers } 65f86d6517SAlan Somers 66f86d6517SAlan Somers ATF_TC_CLEANUP(stat_success, tc) 67f86d6517SAlan Somers { 68f86d6517SAlan Somers cleanup(); 69f86d6517SAlan Somers } 70f86d6517SAlan Somers 71f86d6517SAlan Somers 72f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(stat_failure); 73f86d6517SAlan Somers ATF_TC_HEAD(stat_failure, tc) 74f86d6517SAlan Somers { 75f86d6517SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 76f86d6517SAlan Somers "stat(2) call"); 77f86d6517SAlan Somers } 78f86d6517SAlan Somers 79f86d6517SAlan Somers ATF_TC_BODY(stat_failure, tc) 80f86d6517SAlan Somers { 81f86d6517SAlan Somers FILE *pipefd = setup(fds, auclass); 82f86d6517SAlan Somers /* Failure reason: file does not exist */ 83f86d6517SAlan Somers ATF_REQUIRE_EQ(-1, stat(errpath, &statbuff)); 84f86d6517SAlan Somers check_audit(fds, failurereg, pipefd); 85f86d6517SAlan Somers } 86f86d6517SAlan Somers 87f86d6517SAlan Somers ATF_TC_CLEANUP(stat_failure, tc) 88f86d6517SAlan Somers { 89f86d6517SAlan Somers cleanup(); 90f86d6517SAlan Somers } 91f86d6517SAlan Somers 92f86d6517SAlan Somers 93f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(lstat_success); 94f86d6517SAlan Somers ATF_TC_HEAD(lstat_success, tc) 95f86d6517SAlan Somers { 96f86d6517SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 97f86d6517SAlan Somers "lstat(2) call"); 98f86d6517SAlan Somers } 99f86d6517SAlan Somers 100f86d6517SAlan Somers ATF_TC_BODY(lstat_success, tc) 101f86d6517SAlan Somers { 102f86d6517SAlan Somers /* Symbolic link needs to exist to call lstat(2) */ 103f86d6517SAlan Somers ATF_REQUIRE_EQ(0, symlink("symlink", path)); 104f86d6517SAlan Somers FILE *pipefd = setup(fds, auclass); 105f86d6517SAlan Somers ATF_REQUIRE_EQ(0, lstat(path, &statbuff)); 106f86d6517SAlan Somers check_audit(fds, successreg, pipefd); 107f86d6517SAlan Somers } 108f86d6517SAlan Somers 109f86d6517SAlan Somers ATF_TC_CLEANUP(lstat_success, tc) 110f86d6517SAlan Somers { 111f86d6517SAlan Somers cleanup(); 112f86d6517SAlan Somers } 113f86d6517SAlan Somers 114f86d6517SAlan Somers 115f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(lstat_failure); 116f86d6517SAlan Somers ATF_TC_HEAD(lstat_failure, tc) 117f86d6517SAlan Somers { 118f86d6517SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 119f86d6517SAlan Somers "lstat(2) call"); 120f86d6517SAlan Somers } 121f86d6517SAlan Somers 122f86d6517SAlan Somers ATF_TC_BODY(lstat_failure, tc) 123f86d6517SAlan Somers { 124f86d6517SAlan Somers FILE *pipefd = setup(fds, auclass); 125f86d6517SAlan Somers /* Failure reason: symbolic link does not exist */ 126f86d6517SAlan Somers ATF_REQUIRE_EQ(-1, lstat(errpath, &statbuff)); 127f86d6517SAlan Somers check_audit(fds, failurereg, pipefd); 128f86d6517SAlan Somers } 129f86d6517SAlan Somers 130f86d6517SAlan Somers ATF_TC_CLEANUP(lstat_failure, tc) 131f86d6517SAlan Somers { 132f86d6517SAlan Somers cleanup(); 133f86d6517SAlan Somers } 134f86d6517SAlan Somers 135f86d6517SAlan Somers 136f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstat_success); 137f86d6517SAlan Somers ATF_TC_HEAD(fstat_success, tc) 138f86d6517SAlan Somers { 139f86d6517SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 140f86d6517SAlan Somers "fstat(2) call"); 141f86d6517SAlan Somers } 142f86d6517SAlan Somers 143f86d6517SAlan Somers ATF_TC_BODY(fstat_success, tc) 144f86d6517SAlan Somers { 145f86d6517SAlan Somers /* File needs to exist to call fstat(2) */ 146f86d6517SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1); 147f86d6517SAlan Somers FILE *pipefd = setup(fds, auclass); 148f86d6517SAlan Somers ATF_REQUIRE_EQ(0, fstat(filedesc, &statbuff)); 149f86d6517SAlan Somers 150f86d6517SAlan Somers snprintf(extregex, sizeof(extregex), 151f86d6517SAlan Somers "fstat.*%jd.*return,success", (intmax_t)statbuff.st_ino); 152f86d6517SAlan Somers check_audit(fds, extregex, pipefd); 153*b13a70d5SAlan Somers close(filedesc); 154f86d6517SAlan Somers } 155f86d6517SAlan Somers 156f86d6517SAlan Somers ATF_TC_CLEANUP(fstat_success, tc) 157f86d6517SAlan Somers { 158f86d6517SAlan Somers cleanup(); 159f86d6517SAlan Somers } 160f86d6517SAlan Somers 161f86d6517SAlan Somers 162f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstat_failure); 163f86d6517SAlan Somers ATF_TC_HEAD(fstat_failure, tc) 164f86d6517SAlan Somers { 165f86d6517SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 166f86d6517SAlan Somers "fstat(2) call"); 167f86d6517SAlan Somers } 168f86d6517SAlan Somers 169f86d6517SAlan Somers ATF_TC_BODY(fstat_failure, tc) 170f86d6517SAlan Somers { 171f86d6517SAlan Somers FILE *pipefd = setup(fds, auclass); 172f86d6517SAlan Somers const char *regex = "fstat.*return,failure : Bad file descriptor"; 173f86d6517SAlan Somers /* Failure reason: bad file descriptor */ 174f86d6517SAlan Somers ATF_REQUIRE_EQ(-1, fstat(-1, &statbuff)); 175f86d6517SAlan Somers check_audit(fds, regex, pipefd); 176f86d6517SAlan Somers } 177f86d6517SAlan Somers 178f86d6517SAlan Somers ATF_TC_CLEANUP(fstat_failure, tc) 179f86d6517SAlan Somers { 180f86d6517SAlan Somers cleanup(); 181f86d6517SAlan Somers } 182f86d6517SAlan Somers 183f86d6517SAlan Somers 184f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstatat_success); 185f86d6517SAlan Somers ATF_TC_HEAD(fstatat_success, tc) 186f86d6517SAlan Somers { 187f86d6517SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 188f86d6517SAlan Somers "fstatat(2) call"); 189f86d6517SAlan Somers } 190f86d6517SAlan Somers 191f86d6517SAlan Somers ATF_TC_BODY(fstatat_success, tc) 192f86d6517SAlan Somers { 193f86d6517SAlan Somers /* File or Symbolic link needs to exist to call lstat(2) */ 194f86d6517SAlan Somers ATF_REQUIRE_EQ(0, symlink("symlink", path)); 195f86d6517SAlan Somers FILE *pipefd = setup(fds, auclass); 196f86d6517SAlan Somers ATF_REQUIRE_EQ(0, fstatat(AT_FDCWD, path, &statbuff, 197f86d6517SAlan Somers AT_SYMLINK_NOFOLLOW)); 198f86d6517SAlan Somers check_audit(fds, successreg, pipefd); 199f86d6517SAlan Somers } 200f86d6517SAlan Somers 201f86d6517SAlan Somers ATF_TC_CLEANUP(fstatat_success, tc) 202f86d6517SAlan Somers { 203f86d6517SAlan Somers cleanup(); 204f86d6517SAlan Somers } 205f86d6517SAlan Somers 206f86d6517SAlan Somers 207f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstatat_failure); 208f86d6517SAlan Somers ATF_TC_HEAD(fstatat_failure, tc) 209f86d6517SAlan Somers { 210f86d6517SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 211f86d6517SAlan Somers "fstatat(2) call"); 212f86d6517SAlan Somers } 213f86d6517SAlan Somers 214f86d6517SAlan Somers ATF_TC_BODY(fstatat_failure, tc) 215f86d6517SAlan Somers { 216f86d6517SAlan Somers FILE *pipefd = setup(fds, auclass); 217f86d6517SAlan Somers /* Failure reason: symbolic link does not exist */ 218f86d6517SAlan Somers ATF_REQUIRE_EQ(-1, fstatat(AT_FDCWD, path, &statbuff, 219f86d6517SAlan Somers AT_SYMLINK_NOFOLLOW)); 220f86d6517SAlan Somers check_audit(fds, failurereg, pipefd); 221f86d6517SAlan Somers } 222f86d6517SAlan Somers 223f86d6517SAlan Somers ATF_TC_CLEANUP(fstatat_failure, tc) 224f86d6517SAlan Somers { 225f86d6517SAlan Somers cleanup(); 226f86d6517SAlan Somers } 227f86d6517SAlan Somers 228f86d6517SAlan Somers 229f86d6517SAlan Somers ATF_TP_ADD_TCS(tp) 230f86d6517SAlan Somers { 231f86d6517SAlan Somers ATF_TP_ADD_TC(tp, stat_success); 232f86d6517SAlan Somers ATF_TP_ADD_TC(tp, stat_failure); 233f86d6517SAlan Somers ATF_TP_ADD_TC(tp, lstat_success); 234f86d6517SAlan Somers ATF_TP_ADD_TC(tp, lstat_failure); 235f86d6517SAlan Somers ATF_TP_ADD_TC(tp, fstat_success); 236f86d6517SAlan Somers ATF_TP_ADD_TC(tp, fstat_failure); 237f86d6517SAlan Somers ATF_TP_ADD_TC(tp, fstatat_success); 238f86d6517SAlan Somers ATF_TP_ADD_TC(tp, fstatat_failure); 239f86d6517SAlan Somers 240f86d6517SAlan Somers return (atf_no_error()); 241f86d6517SAlan Somers } 242