1335354Sasomers/*-
2335354Sasomers * Copyright (c) 2018 Aniket Pandey
3335354Sasomers *
4335354Sasomers * Redistribution and use in source and binary forms, with or without
5335354Sasomers * modification, are permitted provided that the following conditions
6335354Sasomers * are met:
7335354Sasomers * 1. Redistributions of source code must retain the above copyright
8335354Sasomers *    notice, this list of conditions and the following disclaimer.
9335354Sasomers * 2. Redistributions in binary form must reproduce the above copyright
10335354Sasomers *    notice, this list of conditions and the following disclaimer in the
11335354Sasomers *    documentation and/or other materials provided with the distribution.
12335354Sasomers *
13335354Sasomers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14335354Sasomers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15335354Sasomers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16335354Sasomers * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17335354Sasomers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18335354Sasomers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19335354Sasomers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20335354Sasomers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21335354Sasomers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22335354Sasomers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23335354Sasomers * SUCH DAMAGE.
24335354Sasomers *
25335354Sasomers * $FreeBSD: stable/11/tests/sys/audit/ioctl.c 339090 2018-10-02 17:27:10Z asomers $
26335354Sasomers */
27335354Sasomers
28335354Sasomers#include <sys/ioctl.h>
29335354Sasomers
30335354Sasomers#include <bsm/libbsm.h>
31335354Sasomers#include <security/audit/audit_ioctl.h>
32335354Sasomers
33335354Sasomers#include <atf-c.h>
34335354Sasomers#include <fcntl.h>
35335354Sasomers#include <unistd.h>
36335354Sasomers
37335354Sasomers#include "utils.h"
38335354Sasomers
39335354Sasomersstatic int filedesc;
40335354Sasomersstatic char ioregex[80];
41335354Sasomersstatic const char *auclass = "io";
42335354Sasomersstatic struct pollfd fds[1];
43335354Sasomersstatic unsigned long request = AUDITPIPE_FLUSH;
44335354Sasomers
45335354Sasomers
46335354SasomersATF_TC_WITH_CLEANUP(ioctl_success);
47335354SasomersATF_TC_HEAD(ioctl_success, tc)
48335354Sasomers{
49335354Sasomers	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
50335354Sasomers					"ioctl(2) call");
51335354Sasomers}
52335354Sasomers
53335354SasomersATF_TC_BODY(ioctl_success, tc)
54335354Sasomers{
55335354Sasomers	/* auditpipe(4) supports quite a few ioctls */
56335354Sasomers	ATF_REQUIRE((filedesc = open("/dev/auditpipe", O_RDONLY)) != -1);
57335354Sasomers	/* Prepare the regex to be checked in the audit record */
58335354Sasomers	snprintf(ioregex, sizeof(ioregex),
59335354Sasomers	"ioctl.*%#lx.*%#x.*return,success", request, filedesc);
60335354Sasomers
61335354Sasomers	FILE *pipefd = setup(fds, auclass);
62335354Sasomers	ATF_REQUIRE(ioctl(filedesc, request) != -1);
63335354Sasomers	check_audit(fds, ioregex, pipefd);
64335354Sasomers	close(filedesc);
65335354Sasomers}
66335354Sasomers
67335354SasomersATF_TC_CLEANUP(ioctl_success, tc)
68335354Sasomers{
69335354Sasomers	cleanup();
70335354Sasomers}
71335354Sasomers
72335354Sasomers
73335354SasomersATF_TC_WITH_CLEANUP(ioctl_failure);
74335354SasomersATF_TC_HEAD(ioctl_failure, tc)
75335354Sasomers{
76335354Sasomers	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
77335354Sasomers					"ioctl(2) call");
78335354Sasomers}
79335354Sasomers
80335354SasomersATF_TC_BODY(ioctl_failure, tc)
81335354Sasomers{
82335354Sasomers	snprintf(ioregex, sizeof(ioregex),
83335354Sasomers	"ioctl.*%#lx.*return,failure : Bad file descriptor", request);
84335354Sasomers
85335354Sasomers	FILE *pipefd = setup(fds, auclass);
86335354Sasomers	/* Failure reason: Invalid file descriptor */
87335354Sasomers	ATF_REQUIRE_EQ(-1, ioctl(-1, request));
88335354Sasomers	check_audit(fds, ioregex, pipefd);
89335354Sasomers}
90335354Sasomers
91335354SasomersATF_TC_CLEANUP(ioctl_failure, tc)
92335354Sasomers{
93335354Sasomers	cleanup();
94335354Sasomers}
95335354Sasomers
96335354Sasomers
97335354SasomersATF_TP_ADD_TCS(tp)
98335354Sasomers{
99335354Sasomers	ATF_TP_ADD_TC(tp, ioctl_success);
100335354Sasomers	ATF_TP_ADD_TC(tp, ioctl_failure);
101335354Sasomers
102335354Sasomers	return (atf_no_error());
103335354Sasomers}
104