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 <atf-c.h> 29#include <fcntl.h> 30 31#include "utils.h" 32 33static struct pollfd fds[1]; 34static char buff[1024]; 35static const char *path = "fileforaudit"; 36static const char *successreg = "fileforaudit.*return,success"; 37static const char *failurereg = "fileforaudit.*return,failure"; 38 39 40ATF_TC_WITH_CLEANUP(readlink_success); 41ATF_TC_HEAD(readlink_success, tc) 42{ 43 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 44 "readlink(2) call"); 45} 46 47ATF_TC_BODY(readlink_success, tc) 48{ 49 memset(buff, 0, sizeof(buff)); 50 ATF_REQUIRE_EQ(0, symlink("symlink", path)); 51 FILE *pipefd = setup(fds, "fr"); 52 ATF_REQUIRE(readlink(path, buff, sizeof(buff)-1) != -1); 53 check_audit(fds, successreg, pipefd); 54} 55 56ATF_TC_CLEANUP(readlink_success, tc) 57{ 58 cleanup(); 59} 60 61 62ATF_TC_WITH_CLEANUP(readlink_failure); 63ATF_TC_HEAD(readlink_failure, tc) 64{ 65 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 66 "readlink(2) call"); 67} 68 69ATF_TC_BODY(readlink_failure, tc) 70{ 71 memset(buff, 0, sizeof(buff)); 72 FILE *pipefd = setup(fds, "fr"); 73 /* Failure reason: symbolic link does not exist */ 74 ATF_REQUIRE_EQ(-1, readlink(path, buff, sizeof(buff)-1)); 75 check_audit(fds, failurereg, pipefd); 76} 77 78ATF_TC_CLEANUP(readlink_failure, tc) 79{ 80 cleanup(); 81} 82 83 84ATF_TC_WITH_CLEANUP(readlinkat_success); 85ATF_TC_HEAD(readlinkat_success, tc) 86{ 87 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 88 "readlinkat(2) call"); 89} 90 91ATF_TC_BODY(readlinkat_success, tc) 92{ 93 memset(buff, 0, sizeof(buff)); 94 ATF_REQUIRE_EQ(0, symlink("symlink", path)); 95 FILE *pipefd = setup(fds, "fr"); 96 ATF_REQUIRE(readlinkat(AT_FDCWD, path, buff, sizeof(buff)-1) != -1); 97 check_audit(fds, successreg, pipefd); 98} 99 100ATF_TC_CLEANUP(readlinkat_success, tc) 101{ 102 cleanup(); 103} 104 105 106ATF_TC_WITH_CLEANUP(readlinkat_failure); 107ATF_TC_HEAD(readlinkat_failure, tc) 108{ 109 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 110 "readlinkat(2) call"); 111} 112 113ATF_TC_BODY(readlinkat_failure, tc) 114{ 115 memset(buff, 0, sizeof(buff)); 116 FILE *pipefd = setup(fds, "fr"); 117 /* Failure reason: symbolic link does not exist */ 118 ATF_REQUIRE_EQ(-1, readlinkat(AT_FDCWD, path, buff, sizeof(buff)-1)); 119 check_audit(fds, failurereg, pipefd); 120} 121 122ATF_TC_CLEANUP(readlinkat_failure, tc) 123{ 124 cleanup(); 125} 126 127 128ATF_TP_ADD_TCS(tp) 129{ 130 ATF_TP_ADD_TC(tp, readlink_success); 131 ATF_TP_ADD_TC(tp, readlink_failure); 132 ATF_TP_ADD_TC(tp, readlinkat_success); 133 ATF_TP_ADD_TC(tp, readlinkat_failure); 134 135 return (atf_no_error()); 136} 137