1 /*- 2 * Copyright 2018 Aniket Pandey 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * SUCH DAMAGE. 24 * 25 * $FreeBSD$ 26 */ 27 28 #include <sys/types.h> 29 #include <sys/stat.h> 30 31 #include <atf-c.h> 32 #include <fcntl.h> 33 #include <stdlib.h> 34 #include <unistd.h> 35 36 #include "utils.h" 37 38 static struct pollfd fds[1]; 39 static mode_t mode = 0777; 40 static dev_t dev = 0; 41 static const char *auclass = "fc"; 42 static const char *path = "fileforaudit"; 43 static const char *successreg = "fileforaudit.*return,success"; 44 static const char *failurereg = "fileforaudit.*return,failure"; 45 46 47 ATF_TC_WITH_CLEANUP(mkdir_success); 48 ATF_TC_HEAD(mkdir_success, tc) 49 { 50 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 51 "mkdir(2) call"); 52 } 53 54 ATF_TC_BODY(mkdir_success, tc) 55 { 56 FILE *pipefd = setup(fds, auclass); 57 ATF_REQUIRE_EQ(0, mkdir(path, mode)); 58 check_audit(fds, successreg, pipefd); 59 } 60 61 ATF_TC_CLEANUP(mkdir_success, tc) 62 { 63 cleanup(); 64 } 65 66 67 ATF_TC_WITH_CLEANUP(mkdir_failure); 68 ATF_TC_HEAD(mkdir_failure, tc) 69 { 70 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 71 "mkdir(2) call"); 72 } 73 74 ATF_TC_BODY(mkdir_failure, tc) 75 { 76 ATF_REQUIRE_EQ(0, mkdir(path, mode)); 77 FILE *pipefd = setup(fds, auclass); 78 /* Failure reason: directory already exists */ 79 ATF_REQUIRE_EQ(-1, mkdir(path, mode)); 80 check_audit(fds, failurereg, pipefd); 81 } 82 83 ATF_TC_CLEANUP(mkdir_failure, tc) 84 { 85 cleanup(); 86 } 87 88 89 ATF_TC_WITH_CLEANUP(mkdirat_success); 90 ATF_TC_HEAD(mkdirat_success, tc) 91 { 92 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 93 "mkdirat(2) call"); 94 } 95 96 ATF_TC_BODY(mkdirat_success, tc) 97 { 98 FILE *pipefd = setup(fds, auclass); 99 ATF_REQUIRE_EQ(0, mkdirat(AT_FDCWD, path, mode)); 100 check_audit(fds, successreg, pipefd); 101 } 102 103 ATF_TC_CLEANUP(mkdirat_success, tc) 104 { 105 cleanup(); 106 } 107 108 109 ATF_TC_WITH_CLEANUP(mkdirat_failure); 110 ATF_TC_HEAD(mkdirat_failure, tc) 111 { 112 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 113 "mkdirat(2) call"); 114 } 115 116 ATF_TC_BODY(mkdirat_failure, tc) 117 { 118 ATF_REQUIRE_EQ(0, mkdirat(AT_FDCWD, path, mode)); 119 FILE *pipefd = setup(fds, auclass); 120 /* Failure reason: directory already exists */ 121 ATF_REQUIRE_EQ(-1, mkdirat(AT_FDCWD, path, mode)); 122 check_audit(fds, failurereg, pipefd); 123 } 124 125 ATF_TC_CLEANUP(mkdirat_failure, tc) 126 { 127 cleanup(); 128 } 129 130 131 ATF_TC_WITH_CLEANUP(mkfifo_success); 132 ATF_TC_HEAD(mkfifo_success, tc) 133 { 134 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 135 "mkfifo(2) call"); 136 } 137 138 ATF_TC_BODY(mkfifo_success, tc) 139 { 140 FILE *pipefd = setup(fds, auclass); 141 ATF_REQUIRE_EQ(0, mkfifo(path, mode)); 142 check_audit(fds, successreg, pipefd); 143 } 144 145 ATF_TC_CLEANUP(mkfifo_success, tc) 146 { 147 cleanup(); 148 } 149 150 151 ATF_TC_WITH_CLEANUP(mkfifo_failure); 152 ATF_TC_HEAD(mkfifo_failure, tc) 153 { 154 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 155 "mkfifo(2) call"); 156 } 157 158 ATF_TC_BODY(mkfifo_failure, tc) 159 { 160 ATF_REQUIRE_EQ(0, mkfifo(path, mode)); 161 FILE *pipefd = setup(fds, auclass); 162 /* Failure reason: FIFO already exists */ 163 ATF_REQUIRE_EQ(-1, mkfifo(path, mode)); 164 check_audit(fds, failurereg, pipefd); 165 } 166 167 ATF_TC_CLEANUP(mkfifo_failure, tc) 168 { 169 cleanup(); 170 } 171 172 173 ATF_TC_WITH_CLEANUP(mkfifoat_success); 174 ATF_TC_HEAD(mkfifoat_success, tc) 175 { 176 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 177 "mkfifoat(2) call"); 178 } 179 180 ATF_TC_BODY(mkfifoat_success, tc) 181 { 182 FILE *pipefd = setup(fds, auclass); 183 ATF_REQUIRE_EQ(0, mkfifoat(AT_FDCWD, path, mode)); 184 check_audit(fds, successreg, pipefd); 185 } 186 187 ATF_TC_CLEANUP(mkfifoat_success, tc) 188 { 189 cleanup(); 190 } 191 192 193 ATF_TC_WITH_CLEANUP(mkfifoat_failure); 194 ATF_TC_HEAD(mkfifoat_failure, tc) 195 { 196 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 197 "mkfifoat(2) call"); 198 } 199 200 ATF_TC_BODY(mkfifoat_failure, tc) 201 { 202 ATF_REQUIRE_EQ(0, mkfifoat(AT_FDCWD, path, mode)); 203 FILE *pipefd = setup(fds, auclass); 204 /* Failure reason: FIFO already exists */ 205 ATF_REQUIRE_EQ(-1, mkfifoat(AT_FDCWD, path, mode)); 206 check_audit(fds, failurereg, pipefd); 207 } 208 209 ATF_TC_CLEANUP(mkfifoat_failure, tc) 210 { 211 cleanup(); 212 } 213 214 215 ATF_TC_WITH_CLEANUP(mknod_success); 216 ATF_TC_HEAD(mknod_success, tc) 217 { 218 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 219 "mknod(2) call"); 220 } 221 222 ATF_TC_BODY(mknod_success, tc) 223 { 224 FILE *pipefd = setup(fds, auclass); 225 ATF_REQUIRE_EQ(0, mknod(path, S_IFIFO | S_IRWXO, dev)); 226 check_audit(fds, successreg, pipefd); 227 } 228 229 ATF_TC_CLEANUP(mknod_success, tc) 230 { 231 cleanup(); 232 } 233 234 235 ATF_TC_WITH_CLEANUP(mknod_failure); 236 ATF_TC_HEAD(mknod_failure, tc) 237 { 238 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 239 "mknod(2) call"); 240 } 241 242 ATF_TC_BODY(mknod_failure, tc) 243 { 244 ATF_REQUIRE_EQ(0, mknod(path, S_IFIFO | S_IRWXO, dev)); 245 FILE *pipefd = setup(fds, auclass); 246 /* Failure reason: FIFO node already exists */ 247 ATF_REQUIRE_EQ(-1, mknod(path, S_IFIFO | S_IRWXO, dev)); 248 check_audit(fds, failurereg, pipefd); 249 } 250 251 ATF_TC_CLEANUP(mknod_failure, tc) 252 { 253 cleanup(); 254 } 255 256 257 ATF_TC_WITH_CLEANUP(mknodat_success); 258 ATF_TC_HEAD(mknodat_success, tc) 259 { 260 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 261 "mknodat(2) call"); 262 } 263 264 ATF_TC_BODY(mknodat_success, tc) 265 { 266 FILE *pipefd = setup(fds, auclass); 267 ATF_REQUIRE_EQ(0, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev)); 268 check_audit(fds, successreg, pipefd); 269 } 270 271 ATF_TC_CLEANUP(mknodat_success, tc) 272 { 273 cleanup(); 274 } 275 276 277 ATF_TC_WITH_CLEANUP(mknodat_failure); 278 ATF_TC_HEAD(mknodat_failure, tc) 279 { 280 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 281 "mknodat(2) call"); 282 } 283 284 ATF_TC_BODY(mknodat_failure, tc) 285 { 286 ATF_REQUIRE_EQ(0, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev)); 287 FILE *pipefd = setup(fds, auclass); 288 /* Failure reason: FIFO node already exists */ 289 ATF_REQUIRE_EQ(-1, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev)); 290 check_audit(fds, failurereg, pipefd); 291 } 292 293 ATF_TC_CLEANUP(mknodat_failure, tc) 294 { 295 cleanup(); 296 } 297 298 299 ATF_TC_WITH_CLEANUP(rename_success); 300 ATF_TC_HEAD(rename_success, tc) 301 { 302 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 303 "rename(2) call"); 304 } 305 306 ATF_TC_BODY(rename_success, tc) 307 { 308 ATF_REQUIRE(open(path, O_CREAT, mode) != -1); 309 FILE *pipefd = setup(fds, auclass); 310 ATF_REQUIRE_EQ(0, rename(path, "renamed")); 311 check_audit(fds, successreg, pipefd); 312 } 313 314 ATF_TC_CLEANUP(rename_success, tc) 315 { 316 cleanup(); 317 } 318 319 320 ATF_TC_WITH_CLEANUP(rename_failure); 321 ATF_TC_HEAD(rename_failure, tc) 322 { 323 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 324 "rename(2) call"); 325 } 326 327 ATF_TC_BODY(rename_failure, tc) 328 { 329 FILE *pipefd = setup(fds, auclass); 330 /* Failure reason: file does not exist */ 331 ATF_REQUIRE_EQ(-1, rename(path, "renamed")); 332 check_audit(fds, failurereg, pipefd); 333 } 334 335 ATF_TC_CLEANUP(rename_failure, tc) 336 { 337 cleanup(); 338 } 339 340 341 ATF_TC_WITH_CLEANUP(renameat_success); 342 ATF_TC_HEAD(renameat_success, tc) 343 { 344 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 345 "renameat(2) call"); 346 } 347 348 ATF_TC_BODY(renameat_success, tc) 349 { 350 ATF_REQUIRE(open(path, O_CREAT, mode) != -1); 351 FILE *pipefd = setup(fds, auclass); 352 ATF_REQUIRE_EQ(0, renameat(AT_FDCWD, path, AT_FDCWD, "renamed")); 353 check_audit(fds, successreg, pipefd); 354 } 355 356 ATF_TC_CLEANUP(renameat_success, tc) 357 { 358 cleanup(); 359 } 360 361 362 ATF_TC_WITH_CLEANUP(renameat_failure); 363 ATF_TC_HEAD(renameat_failure, tc) 364 { 365 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 366 "renameat(2) call"); 367 } 368 369 ATF_TC_BODY(renameat_failure, tc) 370 { 371 FILE *pipefd = setup(fds, auclass); 372 /* Failure reason: file does not exist */ 373 ATF_REQUIRE_EQ(-1, renameat(AT_FDCWD, path, AT_FDCWD, "renamed")); 374 check_audit(fds, failurereg, pipefd); 375 } 376 377 ATF_TC_CLEANUP(renameat_failure, tc) 378 { 379 cleanup(); 380 } 381 382 383 ATF_TC_WITH_CLEANUP(link_success); 384 ATF_TC_HEAD(link_success, tc) 385 { 386 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 387 "link(2) call"); 388 } 389 390 ATF_TC_BODY(link_success, tc) 391 { 392 ATF_REQUIRE(open(path, O_CREAT, mode) != -1); 393 FILE *pipefd = setup(fds, auclass); 394 ATF_REQUIRE_EQ(0, link(path, "hardlink")); 395 check_audit(fds, successreg, pipefd); 396 } 397 398 ATF_TC_CLEANUP(link_success, tc) 399 { 400 cleanup(); 401 } 402 403 404 ATF_TC_WITH_CLEANUP(link_failure); 405 ATF_TC_HEAD(link_failure, tc) 406 { 407 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 408 "link(2) call"); 409 } 410 411 ATF_TC_BODY(link_failure, tc) 412 { 413 FILE *pipefd = setup(fds, auclass); 414 /* Failure reason: file does not exist */ 415 ATF_REQUIRE_EQ(-1, link(path, "hardlink")); 416 check_audit(fds, failurereg, pipefd); 417 } 418 419 ATF_TC_CLEANUP(link_failure, tc) 420 { 421 cleanup(); 422 } 423 424 425 ATF_TC_WITH_CLEANUP(linkat_success); 426 ATF_TC_HEAD(linkat_success, tc) 427 { 428 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 429 "linkat(2) call"); 430 } 431 432 ATF_TC_BODY(linkat_success, tc) 433 { 434 ATF_REQUIRE(open(path, O_CREAT, mode) != -1); 435 FILE *pipefd = setup(fds, auclass); 436 ATF_REQUIRE_EQ(0, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0)); 437 check_audit(fds, successreg, pipefd); 438 } 439 440 ATF_TC_CLEANUP(linkat_success, tc) 441 { 442 cleanup(); 443 } 444 445 446 ATF_TC_WITH_CLEANUP(linkat_failure); 447 ATF_TC_HEAD(linkat_failure, tc) 448 { 449 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 450 "linkat(2) call"); 451 } 452 453 ATF_TC_BODY(linkat_failure, tc) 454 { 455 FILE *pipefd = setup(fds, auclass); 456 /* Failure reason: file does not exist */ 457 ATF_REQUIRE_EQ(-1, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0)); 458 check_audit(fds, failurereg, pipefd); 459 } 460 461 ATF_TC_CLEANUP(linkat_failure, tc) 462 { 463 cleanup(); 464 } 465 466 467 ATF_TC_WITH_CLEANUP(symlink_success); 468 ATF_TC_HEAD(symlink_success, tc) 469 { 470 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 471 "symlink(2) call"); 472 } 473 474 ATF_TC_BODY(symlink_success, tc) 475 { 476 FILE *pipefd = setup(fds, auclass); 477 ATF_REQUIRE_EQ(0, symlink(path, "symlink")); 478 check_audit(fds, successreg, pipefd); 479 } 480 481 ATF_TC_CLEANUP(symlink_success, tc) 482 { 483 cleanup(); 484 } 485 486 487 ATF_TC_WITH_CLEANUP(symlink_failure); 488 ATF_TC_HEAD(symlink_failure, tc) 489 { 490 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 491 "symlink(2) call"); 492 } 493 494 ATF_TC_BODY(symlink_failure, tc) 495 { 496 ATF_REQUIRE_EQ(0, symlink(path, "symlink")); 497 FILE *pipefd = setup(fds, auclass); 498 /* Failure reason: symbolic link already exists */ 499 ATF_REQUIRE_EQ(-1, symlink(path, "symlink")); 500 check_audit(fds, failurereg, pipefd); 501 } 502 503 ATF_TC_CLEANUP(symlink_failure, tc) 504 { 505 cleanup(); 506 } 507 508 509 ATF_TC_WITH_CLEANUP(symlinkat_success); 510 ATF_TC_HEAD(symlinkat_success, tc) 511 { 512 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 513 "symlinkat(2) call"); 514 } 515 516 ATF_TC_BODY(symlinkat_success, tc) 517 { 518 FILE *pipefd = setup(fds, auclass); 519 ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink")); 520 check_audit(fds, successreg, pipefd); 521 } 522 523 ATF_TC_CLEANUP(symlinkat_success, tc) 524 { 525 cleanup(); 526 } 527 528 529 ATF_TC_WITH_CLEANUP(symlinkat_failure); 530 ATF_TC_HEAD(symlinkat_failure, tc) 531 { 532 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 533 "symlinkat(2) call"); 534 } 535 536 ATF_TC_BODY(symlinkat_failure, tc) 537 { 538 ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink")); 539 FILE *pipefd = setup(fds, auclass); 540 /* Failure reason: symbolic link already exists */ 541 ATF_REQUIRE_EQ(-1, symlinkat(path, AT_FDCWD, "symlink")); 542 check_audit(fds, failurereg, pipefd); 543 } 544 545 ATF_TC_CLEANUP(symlinkat_failure, tc) 546 { 547 cleanup(); 548 } 549 550 551 ATF_TP_ADD_TCS(tp) 552 { 553 ATF_TP_ADD_TC(tp, mkdir_success); 554 ATF_TP_ADD_TC(tp, mkdir_failure); 555 ATF_TP_ADD_TC(tp, mkdirat_success); 556 ATF_TP_ADD_TC(tp, mkdirat_failure); 557 558 ATF_TP_ADD_TC(tp, mkfifo_success); 559 ATF_TP_ADD_TC(tp, mkfifo_failure); 560 ATF_TP_ADD_TC(tp, mkfifoat_success); 561 ATF_TP_ADD_TC(tp, mkfifoat_failure); 562 563 ATF_TP_ADD_TC(tp, mknod_success); 564 ATF_TP_ADD_TC(tp, mknod_failure); 565 ATF_TP_ADD_TC(tp, mknodat_success); 566 ATF_TP_ADD_TC(tp, mknodat_failure); 567 568 ATF_TP_ADD_TC(tp, rename_success); 569 ATF_TP_ADD_TC(tp, rename_failure); 570 ATF_TP_ADD_TC(tp, renameat_success); 571 ATF_TP_ADD_TC(tp, renameat_failure); 572 573 ATF_TP_ADD_TC(tp, link_success); 574 ATF_TP_ADD_TC(tp, link_failure); 575 ATF_TP_ADD_TC(tp, linkat_success); 576 ATF_TP_ADD_TC(tp, linkat_failure); 577 578 ATF_TP_ADD_TC(tp, symlink_success); 579 ATF_TP_ADD_TC(tp, symlink_failure); 580 ATF_TP_ADD_TC(tp, symlinkat_success); 581 ATF_TP_ADD_TC(tp, symlinkat_failure); 582 583 return (atf_no_error()); 584 } 585