xref: /freebsd/tests/sys/audit/inter-process.c (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
1 /*-
2  * Copyright (c) 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/ipc.h>
30 #include <sys/mman.h>
31 #include <sys/msg.h>
32 #include <sys/shm.h>
33 #define _WANT_SEMUN
34 #include <sys/sem.h>
35 #include <sys/stat.h>
36 
37 #include <atf-c.h>
38 #include <fcntl.h>
39 #include <stdlib.h>
40 #include <unistd.h>
41 
42 #include "utils.h"
43 #define BUFFSIZE 80
44 
45 struct msgstr {
46 	long int	 mtype;
47 	char		 mtext[BUFFSIZE];
48 };
49 typedef struct msgstr msgstr_t;
50 
51 static pid_t pid;
52 static int msqid, shmid, semid;
53 static union semun semarg;
54 static struct pollfd fds[1];
55 static struct msqid_ds msgbuff;
56 static struct shmid_ds shmbuff;
57 static struct semid_ds sembuff;
58 static char ipcregex[BUFFSIZE];
59 static const char *auclass = "ip";
60 static char path[BUFFSIZE] = "/fileforaudit";
61 static unsigned short semvals[BUFFSIZE];
62 
63 
64 ATF_TC_WITH_CLEANUP(msgget_success);
65 ATF_TC_HEAD(msgget_success, tc)
66 {
67 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
68 					"msgget(2) call");
69 }
70 
71 ATF_TC_BODY(msgget_success, tc)
72 {
73 	FILE *pipefd = setup(fds, auclass);
74 	/* Create a message queue and obtain the corresponding identifier */
75 	ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
76 	/* Check the presence of message queue ID in audit record */
77 	snprintf(ipcregex, sizeof(ipcregex),
78 			"msgget.*return,success,%d", msqid);
79 	check_audit(fds, ipcregex, pipefd);
80 
81 	/* Destroy the message queue with ID = msqid */
82 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
83 }
84 
85 ATF_TC_CLEANUP(msgget_success, tc)
86 {
87 	cleanup();
88 }
89 
90 
91 ATF_TC_WITH_CLEANUP(msgget_failure);
92 ATF_TC_HEAD(msgget_failure, tc)
93 {
94 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
95 					"msgget(2) call");
96 }
97 
98 ATF_TC_BODY(msgget_failure, tc)
99 {
100 	const char *regex = "msgget.*return,failure.*No such file or directory";
101 	FILE *pipefd = setup(fds, auclass);
102 	ATF_REQUIRE_EQ(-1, msgget((key_t)(-1), 0));
103 	check_audit(fds, regex, pipefd);
104 }
105 
106 ATF_TC_CLEANUP(msgget_failure, tc)
107 {
108 	cleanup();
109 }
110 
111 
112 ATF_TC_WITH_CLEANUP(msgsnd_success);
113 ATF_TC_HEAD(msgsnd_success, tc)
114 {
115 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
116 					"msgsnd(2) call");
117 }
118 
119 ATF_TC_BODY(msgsnd_success, tc)
120 {
121 	/* Create a message queue and obtain the corresponding identifier */
122 	ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
123 
124 	/* Initialize a msgstr_t structure to store message */
125 	msgstr_t msg;
126 	msg.mtype = 1;
127 	memset(msg.mtext, 0, BUFFSIZE);
128 
129 	/* Check the presence of message queue ID in audit record */
130 	snprintf(ipcregex, sizeof(ipcregex),
131 		"msgsnd.*Message IPC.*%d.*return,success", msqid);
132 
133 	FILE *pipefd = setup(fds, auclass);
134 	ATF_REQUIRE_EQ(0, msgsnd(msqid, &msg, BUFFSIZE, IPC_NOWAIT));
135 	check_audit(fds, ipcregex, pipefd);
136 
137 	/* Destroy the message queue with ID = msqid */
138 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
139 }
140 
141 ATF_TC_CLEANUP(msgsnd_success, tc)
142 {
143 	cleanup();
144 }
145 
146 
147 ATF_TC_WITH_CLEANUP(msgsnd_failure);
148 ATF_TC_HEAD(msgsnd_failure, tc)
149 {
150 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
151 					"msgsnd(2) call");
152 }
153 
154 ATF_TC_BODY(msgsnd_failure, tc)
155 {
156 	const char *regex = "msgsnd.*Message IPC.*return,failure : Bad address";
157 	FILE *pipefd = setup(fds, auclass);
158 	ATF_REQUIRE_EQ(-1, msgsnd(-1, NULL, 0, IPC_NOWAIT));
159 	check_audit(fds, regex, pipefd);
160 }
161 
162 ATF_TC_CLEANUP(msgsnd_failure, tc)
163 {
164 	cleanup();
165 }
166 
167 
168 ATF_TC_WITH_CLEANUP(msgrcv_success);
169 ATF_TC_HEAD(msgrcv_success, tc)
170 {
171 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
172 					"msgrcv(2) call");
173 }
174 
175 ATF_TC_BODY(msgrcv_success, tc)
176 {
177 	ssize_t recv_bytes;
178 	/* Create a message queue and obtain the corresponding identifier */
179 	ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
180 
181 	/* Initialize two msgstr_t structures to store respective messages */
182 	msgstr_t msg1, msg2;
183 	msg1.mtype = 1;
184 	memset(msg1.mtext, 0, BUFFSIZE);
185 
186 	/* Send a message to the queue with ID = msqid */
187 	ATF_REQUIRE_EQ(0, msgsnd(msqid, &msg1, BUFFSIZE, IPC_NOWAIT));
188 
189 	FILE *pipefd = setup(fds, auclass);
190 	ATF_REQUIRE((recv_bytes = msgrcv(msqid, &msg2,
191 			BUFFSIZE, 0, MSG_NOERROR | IPC_NOWAIT)) != -1);
192 	/* Check the presence of queue ID and returned bytes in audit record */
193 	snprintf(ipcregex, sizeof(ipcregex),
194 	"msgrcv.*Message IPC,*%d.*return,success,%zd", msqid, recv_bytes);
195 	check_audit(fds, ipcregex, pipefd);
196 
197 	/* Destroy the message queue with ID = msqid */
198 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
199 }
200 
201 ATF_TC_CLEANUP(msgrcv_success, tc)
202 {
203 	cleanup();
204 }
205 
206 
207 ATF_TC_WITH_CLEANUP(msgrcv_failure);
208 ATF_TC_HEAD(msgrcv_failure, tc)
209 {
210 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
211 					"msgrcv(2) call");
212 }
213 
214 ATF_TC_BODY(msgrcv_failure, tc)
215 {
216 	const char *regex = "msgrcv.*return,failure : Invalid argument";
217 	FILE *pipefd = setup(fds, auclass);
218 	ATF_REQUIRE_EQ(-1, msgrcv(-1, NULL, 0, 0, MSG_NOERROR | IPC_NOWAIT));
219 	check_audit(fds, regex, pipefd);
220 }
221 
222 ATF_TC_CLEANUP(msgrcv_failure, tc)
223 {
224 	cleanup();
225 }
226 
227 
228 ATF_TC_WITH_CLEANUP(msgctl_rmid_success);
229 ATF_TC_HEAD(msgctl_rmid_success, tc)
230 {
231 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
232 					"msgctl(2) call for IPC_RMID command");
233 }
234 
235 ATF_TC_BODY(msgctl_rmid_success, tc)
236 {
237 	/* Create a message queue and obtain the corresponding identifier */
238 	ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
239 
240 	FILE *pipefd = setup(fds, auclass);
241 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
242 	/* Check the presence of queue ID and IPC_RMID in audit record */
243 	snprintf(ipcregex, sizeof(ipcregex),
244 			"msgctl.*IPC_RMID.*%d.*return,success", msqid);
245 	check_audit(fds, ipcregex, pipefd);
246 }
247 
248 ATF_TC_CLEANUP(msgctl_rmid_success, tc)
249 {
250 	cleanup();
251 }
252 
253 
254 ATF_TC_WITH_CLEANUP(msgctl_rmid_failure);
255 ATF_TC_HEAD(msgctl_rmid_failure, tc)
256 {
257 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
258 					"msgctl(2) call for IPC_RMID command");
259 }
260 
261 ATF_TC_BODY(msgctl_rmid_failure, tc)
262 {
263 	const char *regex = "msgctl.*IPC_RMID.*return,failur.*Invalid argument";
264 	FILE *pipefd = setup(fds, auclass);
265 	ATF_REQUIRE_EQ(-1, msgctl(-1, IPC_RMID, NULL));
266 	check_audit(fds, regex, pipefd);
267 }
268 
269 ATF_TC_CLEANUP(msgctl_rmid_failure, tc)
270 {
271 	cleanup();
272 }
273 
274 
275 ATF_TC_WITH_CLEANUP(msgctl_stat_success);
276 ATF_TC_HEAD(msgctl_stat_success, tc)
277 {
278 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
279 					"msgctl(2) call for IPC_STAT command");
280 }
281 
282 ATF_TC_BODY(msgctl_stat_success, tc)
283 {
284 	/* Create a message queue and obtain the corresponding identifier */
285 	ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
286 
287 	FILE *pipefd = setup(fds, auclass);
288 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_STAT, &msgbuff));
289 	/* Check the presence of queue ID and IPC_STAT in audit record */
290 	snprintf(ipcregex, sizeof(ipcregex),
291 			"msgctl.*IPC_STAT.*%d.*return,success", msqid);
292 	check_audit(fds, ipcregex, pipefd);
293 
294 	/* Destroy the message queue with ID = msqid */
295 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
296 }
297 
298 ATF_TC_CLEANUP(msgctl_stat_success, tc)
299 {
300 	cleanup();
301 }
302 
303 
304 ATF_TC_WITH_CLEANUP(msgctl_stat_failure);
305 ATF_TC_HEAD(msgctl_stat_failure, tc)
306 {
307 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
308 					"msgctl(2) call for IPC_STAT command");
309 }
310 
311 ATF_TC_BODY(msgctl_stat_failure, tc)
312 {
313 	const char *regex = "msgctl.*IPC_STAT.*return,failur.*Invalid argument";
314 	FILE *pipefd = setup(fds, auclass);
315 	ATF_REQUIRE_EQ(-1, msgctl(-1, IPC_STAT, &msgbuff));
316 	check_audit(fds, regex, pipefd);
317 }
318 
319 ATF_TC_CLEANUP(msgctl_stat_failure, tc)
320 {
321 	cleanup();
322 }
323 
324 
325 ATF_TC_WITH_CLEANUP(msgctl_set_success);
326 ATF_TC_HEAD(msgctl_set_success, tc)
327 {
328 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
329 					"msgctl(2) call for IPC_SET command");
330 }
331 
332 ATF_TC_BODY(msgctl_set_success, tc)
333 {
334 	/* Create a message queue and obtain the corresponding identifier */
335 	ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
336 	/* Fill up the msgbuff structure to be used with IPC_SET */
337 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_STAT, &msgbuff));
338 
339 	FILE *pipefd = setup(fds, auclass);
340 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_SET, &msgbuff));
341 	/* Check the presence of message queue ID in audit record */
342 	snprintf(ipcregex, sizeof(ipcregex),
343 			"msgctl.*IPC_SET.*%d.*return,success", msqid);
344 	check_audit(fds, ipcregex, pipefd);
345 
346 	/* Destroy the message queue with ID = msqid */
347 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
348 }
349 
350 ATF_TC_CLEANUP(msgctl_set_success, tc)
351 {
352 	cleanup();
353 }
354 
355 
356 ATF_TC_WITH_CLEANUP(msgctl_set_failure);
357 ATF_TC_HEAD(msgctl_set_failure, tc)
358 {
359 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
360 					"msgctl(2) call for IPC_SET command");
361 }
362 
363 ATF_TC_BODY(msgctl_set_failure, tc)
364 {
365 	const char *regex = "msgctl.*IPC_SET.*return,failure.*Invalid argument";
366 	FILE *pipefd = setup(fds, auclass);
367 	ATF_REQUIRE_EQ(-1, msgctl(-1, IPC_SET, &msgbuff));
368 	check_audit(fds, regex, pipefd);
369 }
370 
371 ATF_TC_CLEANUP(msgctl_set_failure, tc)
372 {
373 	cleanup();
374 }
375 
376 
377 ATF_TC_WITH_CLEANUP(msgctl_illegal_command);
378 ATF_TC_HEAD(msgctl_illegal_command, tc)
379 {
380 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
381 					"msgctl(2) call for illegal cmd value");
382 }
383 
384 ATF_TC_BODY(msgctl_illegal_command, tc)
385 {
386 	/* Create a message queue and obtain the corresponding identifier */
387 	ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
388 
389 	const char *regex = "msgctl.*illegal command.*failur.*Invalid argument";
390 	FILE *pipefd = setup(fds, auclass);
391 	ATF_REQUIRE_EQ(-1, msgctl(msqid, -1, &msgbuff));
392 	check_audit(fds, regex, pipefd);
393 
394 	/* Destroy the message queue with ID = msqid */
395 	ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
396 }
397 
398 ATF_TC_CLEANUP(msgctl_illegal_command, tc)
399 {
400 	cleanup();
401 }
402 
403 
404 ATF_TC_WITH_CLEANUP(shmget_success);
405 ATF_TC_HEAD(shmget_success, tc)
406 {
407 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
408 					"shmget(2) call");
409 }
410 
411 ATF_TC_BODY(shmget_success, tc)
412 {
413 	FILE *pipefd = setup(fds, auclass);
414 	ATF_REQUIRE((shmid =
415 		shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
416 	/* Check the presence of shared memory ID in audit record */
417 	snprintf(ipcregex, sizeof(ipcregex), "shmget.*ret.*success,%d", shmid);
418 	check_audit(fds, ipcregex, pipefd);
419 
420 	/* Destroy the shared memory with ID = shmid */
421 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
422 }
423 
424 ATF_TC_CLEANUP(shmget_success, tc)
425 {
426 	cleanup();
427 }
428 
429 
430 ATF_TC_WITH_CLEANUP(shmget_failure);
431 ATF_TC_HEAD(shmget_failure, tc)
432 {
433 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
434 					"shmget(2) call");
435 }
436 
437 ATF_TC_BODY(shmget_failure, tc)
438 {
439 	const char *regex = "shmget.*return,failure.*No such file or directory";
440 	FILE *pipefd = setup(fds, auclass);
441 	ATF_REQUIRE_EQ(-1, shmget((key_t)(-1), 0, 0));
442 	check_audit(fds, regex, pipefd);
443 }
444 
445 ATF_TC_CLEANUP(shmget_failure, tc)
446 {
447 	cleanup();
448 }
449 
450 
451 ATF_TC_WITH_CLEANUP(shmat_success);
452 ATF_TC_HEAD(shmat_success, tc)
453 {
454 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
455 					"shmat(2) call");
456 }
457 
458 ATF_TC_BODY(shmat_success, tc)
459 {
460 	void *addr;
461 	/* Create a shared memory segment and obtain the identifier */
462 	ATF_REQUIRE((shmid =
463 		shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
464 
465 	FILE *pipefd = setup(fds, auclass);
466 	ATF_REQUIRE((intptr_t)(addr = shmat(shmid, NULL, 0)) != -1);
467 
468 	/* Check for shared memory ID and process address in record */
469 	snprintf(ipcregex, sizeof(ipcregex), "shmat.*Shared Memory "
470 			"IPC.*%d.*return,success", shmid);
471 	check_audit(fds, ipcregex, pipefd);
472 
473 	/* Destroy the shared memory with ID = shmid */
474 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
475 }
476 
477 ATF_TC_CLEANUP(shmat_success, tc)
478 {
479 	cleanup();
480 }
481 
482 
483 ATF_TC_WITH_CLEANUP(shmat_failure);
484 ATF_TC_HEAD(shmat_failure, tc)
485 {
486 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
487 					"shmat(2) call");
488 }
489 
490 ATF_TC_BODY(shmat_failure, tc)
491 {
492 	const char *regex = "shmat.*Shared Memory IPC.*return,failure";
493 	FILE *pipefd = setup(fds, auclass);
494 	ATF_REQUIRE_EQ(-1, (intptr_t)shmat(-1, NULL, 0));
495 	check_audit(fds, regex, pipefd);
496 }
497 
498 ATF_TC_CLEANUP(shmat_failure, tc)
499 {
500 	cleanup();
501 }
502 
503 
504 ATF_TC_WITH_CLEANUP(shmdt_success);
505 ATF_TC_HEAD(shmdt_success, tc)
506 {
507 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
508 					"shmdt(2) call");
509 }
510 
511 ATF_TC_BODY(shmdt_success, tc)
512 {
513 	void *addr;
514 	pid = getpid();
515 	snprintf(ipcregex, sizeof(ipcregex), "shmdt.*%d.*return,success", pid);
516 
517 	/* Create a shared memory segment and obtain the identifier */
518 	ATF_REQUIRE((shmid =
519 		shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
520 
521 	/* Attach the shared memory to calling process's address space */
522 	ATF_REQUIRE((intptr_t)(addr = shmat(shmid, NULL, 0)) != -1);
523 
524 	FILE *pipefd = setup(fds, auclass);
525 	ATF_REQUIRE_EQ(0, shmdt(addr));
526 	check_audit(fds, ipcregex, pipefd);
527 
528 	/* Destroy the shared memory with ID = shmid */
529 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
530 }
531 
532 ATF_TC_CLEANUP(shmdt_success, tc)
533 {
534 	cleanup();
535 }
536 
537 
538 ATF_TC_WITH_CLEANUP(shmdt_failure);
539 ATF_TC_HEAD(shmdt_failure, tc)
540 {
541 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
542 					"shmdt(2) call");
543 }
544 
545 ATF_TC_BODY(shmdt_failure, tc)
546 {
547 	const char *regex = "shmdt.*return,failure : Invalid argument";
548 	FILE *pipefd = setup(fds, auclass);
549 	ATF_REQUIRE_EQ(-1, shmdt(NULL));
550 	check_audit(fds, regex, pipefd);
551 }
552 
553 ATF_TC_CLEANUP(shmdt_failure, tc)
554 {
555 	cleanup();
556 }
557 
558 
559 ATF_TC_WITH_CLEANUP(shmctl_rmid_success);
560 ATF_TC_HEAD(shmctl_rmid_success, tc)
561 {
562 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
563 					"shmctl(2) call for IPC_RMID command");
564 }
565 
566 ATF_TC_BODY(shmctl_rmid_success, tc)
567 {
568 	/* Create a shared memory segment and obtain the identifier */
569 	ATF_REQUIRE((shmid =
570 		shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
571 
572 	FILE *pipefd = setup(fds, auclass);
573 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
574 	/* Check the presence of shmid and IPC_RMID in audit record */
575 	snprintf(ipcregex, sizeof(ipcregex),
576 		"shmctl.*IPC_RMID.*%d.*return,success", shmid);
577 	check_audit(fds, ipcregex, pipefd);
578 }
579 
580 ATF_TC_CLEANUP(shmctl_rmid_success, tc)
581 {
582 	cleanup();
583 }
584 
585 
586 ATF_TC_WITH_CLEANUP(shmctl_rmid_failure);
587 ATF_TC_HEAD(shmctl_rmid_failure, tc)
588 {
589 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
590 					"shmctl(2) call for IPC_RMID command");
591 }
592 
593 ATF_TC_BODY(shmctl_rmid_failure, tc)
594 {
595 	const char *regex = "shmctl.*IPC_RMID.*return,fail.*Invalid argument";
596 	FILE *pipefd = setup(fds, auclass);
597 	ATF_REQUIRE_EQ(-1, shmctl(-1, IPC_RMID, NULL));
598 	check_audit(fds, regex, pipefd);
599 }
600 
601 ATF_TC_CLEANUP(shmctl_rmid_failure, tc)
602 {
603 	cleanup();
604 }
605 
606 
607 ATF_TC_WITH_CLEANUP(shmctl_stat_success);
608 ATF_TC_HEAD(shmctl_stat_success, tc)
609 {
610 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
611 					"shmctl(2) call for IPC_STAT command");
612 }
613 
614 ATF_TC_BODY(shmctl_stat_success, tc)
615 {
616 	/* Create a shared memory segment and obtain the identifier */
617 	ATF_REQUIRE((shmid =
618 		shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
619 
620 	FILE *pipefd = setup(fds, auclass);
621 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_STAT, &shmbuff));
622 	/* Check if shared memory ID and IPC_STAT are present in audit record */
623 	snprintf(ipcregex, sizeof(ipcregex),
624 		"shmctl.*IPC_STAT.*%d.*return,success", shmid);
625 	check_audit(fds, ipcregex, pipefd);
626 
627 	/* Destroy the shared memory with ID = shmid */
628 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
629 }
630 
631 ATF_TC_CLEANUP(shmctl_stat_success, tc)
632 {
633 	cleanup();
634 }
635 
636 
637 ATF_TC_WITH_CLEANUP(shmctl_stat_failure);
638 ATF_TC_HEAD(shmctl_stat_failure, tc)
639 {
640 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
641 					"shmctl(2) call for IPC_STAT command");
642 }
643 
644 ATF_TC_BODY(shmctl_stat_failure, tc)
645 {
646 	const char *regex = "shmctl.*IPC_STAT.*return,fail.*Invalid argument";
647 	FILE *pipefd = setup(fds, auclass);
648 	ATF_REQUIRE_EQ(-1, shmctl(-1, IPC_STAT, &shmbuff));
649 	check_audit(fds, regex, pipefd);
650 }
651 
652 ATF_TC_CLEANUP(shmctl_stat_failure, tc)
653 {
654 	cleanup();
655 }
656 
657 
658 ATF_TC_WITH_CLEANUP(shmctl_set_success);
659 ATF_TC_HEAD(shmctl_set_success, tc)
660 {
661 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
662 					"shmctl(2) call for IPC_SET command");
663 }
664 
665 ATF_TC_BODY(shmctl_set_success, tc)
666 {
667 	/* Create a shared memory segment and obtain the identifier */
668 	ATF_REQUIRE((shmid =
669 		shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
670 	/* Fill up the shmbuff structure to be used with IPC_SET */
671 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_STAT, &shmbuff));
672 
673 	FILE *pipefd = setup(fds, auclass);
674 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_SET, &shmbuff));
675 	/* Check the presence of shared memory ID in audit record */
676 	snprintf(ipcregex, sizeof(ipcregex),
677 		"shmctl.*IPC_SET.*%d.*return,success", msqid);
678 	check_audit(fds, ipcregex, pipefd);
679 
680 	/* Destroy the shared memory with ID = shmid */
681 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
682 }
683 
684 ATF_TC_CLEANUP(shmctl_set_success, tc)
685 {
686 	cleanup();
687 }
688 
689 
690 ATF_TC_WITH_CLEANUP(shmctl_set_failure);
691 ATF_TC_HEAD(shmctl_set_failure, tc)
692 {
693 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
694 					"shmctl(2) call for IPC_SET command");
695 }
696 
697 ATF_TC_BODY(shmctl_set_failure, tc)
698 {
699 	const char *regex = "shmctl.*IPC_SET.*return,failure.*Invalid argument";
700 	FILE *pipefd = setup(fds, auclass);
701 	ATF_REQUIRE_EQ(-1, shmctl(-1, IPC_SET, &shmbuff));
702 	check_audit(fds, regex, pipefd);
703 }
704 
705 ATF_TC_CLEANUP(shmctl_set_failure, tc)
706 {
707 	cleanup();
708 }
709 
710 
711 ATF_TC_WITH_CLEANUP(shmctl_illegal_command);
712 ATF_TC_HEAD(shmctl_illegal_command, tc)
713 {
714 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
715 					"shmctl(2) call for illegal cmd value");
716 }
717 
718 ATF_TC_BODY(shmctl_illegal_command, tc)
719 {
720 	/* Create a shared memory segment and obtain the identifier */
721 	ATF_REQUIRE((shmid =
722 		shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
723 
724 	const char *regex = "shmctl.*illegal command.*fail.*Invalid argument";
725 	FILE *pipefd = setup(fds, auclass);
726 	ATF_REQUIRE_EQ(-1, shmctl(shmid, -1, &shmbuff));
727 	check_audit(fds, regex, pipefd);
728 
729 	/* Destroy the shared memory with ID = shmid */
730 	ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
731 }
732 
733 ATF_TC_CLEANUP(shmctl_illegal_command, tc)
734 {
735 	cleanup();
736 }
737 
738 
739 ATF_TC_WITH_CLEANUP(semget_success);
740 ATF_TC_HEAD(semget_success, tc)
741 {
742 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
743 					"semget(2) call");
744 }
745 
746 ATF_TC_BODY(semget_success, tc)
747 {
748 	FILE *pipefd = setup(fds, auclass);
749 	ATF_REQUIRE((semid =
750 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
751 
752 	/* Check the presence of semaphore set ID in audit record */
753 	snprintf(ipcregex, sizeof(ipcregex),
754 		"semget.*return,success,%d", semid);
755 	check_audit(fds, ipcregex, pipefd);
756 
757 	/* Destroy the semaphore set with ID = semid */
758 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
759 }
760 
761 ATF_TC_CLEANUP(semget_success, tc)
762 {
763 	cleanup();
764 }
765 
766 
767 ATF_TC_WITH_CLEANUP(semget_failure);
768 ATF_TC_HEAD(semget_failure, tc)
769 {
770 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
771 					"semget(2) call");
772 }
773 
774 ATF_TC_BODY(semget_failure, tc)
775 {
776 	pid = getpid();
777 	snprintf(ipcregex, sizeof(ipcregex), "semget.*%d.*return,failure", pid);
778 
779 	FILE *pipefd = setup(fds, auclass);
780 	/* Failure reason: nsems is a negative number */
781 	ATF_REQUIRE_EQ(-1, semget(IPC_PRIVATE, -1, 0));
782 	check_audit(fds, ipcregex, pipefd);
783 }
784 
785 ATF_TC_CLEANUP(semget_failure, tc)
786 {
787 	cleanup();
788 }
789 
790 
791 ATF_TC_WITH_CLEANUP(semop_success);
792 ATF_TC_HEAD(semop_success, tc)
793 {
794 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
795 					"semop(2) call");
796 }
797 
798 ATF_TC_BODY(semop_success, tc)
799 {
800 	/* Create a semaphore set and obtain the set identifier */
801 	ATF_REQUIRE((semid =
802 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
803 
804 	/* Initialize a sembuf structure to operate on semaphore set */
805 	struct sembuf sop[1] = {{0, 1, 0}};
806 	/* Check the presence of semaphore set ID in audit record */
807 	snprintf(ipcregex, sizeof(ipcregex),
808 		"semop.*Semaphore IPC.*%d.*return,success", semid);
809 
810 	FILE *pipefd = setup(fds, auclass);
811 	ATF_REQUIRE_EQ(0, semop(semid, sop, sizeof(sop)/sizeof(struct sembuf)));
812 	check_audit(fds, ipcregex, pipefd);
813 
814 	/* Destroy the semaphore set with ID = semid */
815 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
816 }
817 
818 ATF_TC_CLEANUP(semop_success, tc)
819 {
820 	cleanup();
821 }
822 
823 
824 ATF_TC_WITH_CLEANUP(semop_failure);
825 ATF_TC_HEAD(semop_failure, tc)
826 {
827 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
828 					"semop(2) call");
829 }
830 
831 ATF_TC_BODY(semop_failure, tc)
832 {
833 	const char *regex = "semop.*0xffff.*return,failure : Invalid argument";
834 	FILE *pipefd = setup(fds, auclass);
835 	ATF_REQUIRE_EQ(-1, semop(-1, NULL, 0));
836 	check_audit(fds, regex, pipefd);
837 }
838 
839 ATF_TC_CLEANUP(semop_failure, tc)
840 {
841 	cleanup();
842 }
843 
844 
845 ATF_TC_WITH_CLEANUP(semctl_getval_success);
846 ATF_TC_HEAD(semctl_getval_success, tc)
847 {
848 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
849 					"semctl(2) call for GETVAL command");
850 }
851 
852 ATF_TC_BODY(semctl_getval_success, tc)
853 {
854 	/* Create a semaphore set and obtain the set identifier */
855 	ATF_REQUIRE((semid =
856 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
857 
858 	FILE *pipefd = setup(fds, auclass);
859 	ATF_REQUIRE_EQ(0, semctl(semid, 0, GETVAL));
860 	/* Check the presence of semaphore ID and GETVAL in audit record */
861 	snprintf(ipcregex, sizeof(ipcregex),
862 		"semctl.*GETVAL.*%d.*return,success", semid);
863 	check_audit(fds, ipcregex, pipefd);
864 
865 	/* Destroy the semaphore set with ID = semid */
866 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
867 }
868 
869 ATF_TC_CLEANUP(semctl_getval_success, tc)
870 {
871 	cleanup();
872 }
873 
874 
875 ATF_TC_WITH_CLEANUP(semctl_getval_failure);
876 ATF_TC_HEAD(semctl_getval_failure, tc)
877 {
878 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
879 					"semctl(2) call for GETVAL command");
880 }
881 
882 ATF_TC_BODY(semctl_getval_failure, tc)
883 {
884 	const char *regex = "semctl.*GETVAL.*return,failure : Invalid argument";
885 	FILE *pipefd = setup(fds, auclass);
886 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETVAL));
887 	check_audit(fds, regex, pipefd);
888 }
889 
890 ATF_TC_CLEANUP(semctl_getval_failure, tc)
891 {
892 	cleanup();
893 }
894 
895 
896 ATF_TC_WITH_CLEANUP(semctl_setval_success);
897 ATF_TC_HEAD(semctl_setval_success, tc)
898 {
899 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
900 					"semctl(2) call for SETVAL command");
901 }
902 
903 ATF_TC_BODY(semctl_setval_success, tc)
904 {
905 	/* Create a semaphore set and obtain the set identifier */
906 	ATF_REQUIRE((semid =
907 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
908 
909 	semarg.val = 1;
910 	FILE *pipefd = setup(fds, auclass);
911 	ATF_REQUIRE_EQ(0, semctl(semid, 0, SETVAL, semarg));
912 	/* Check the presence of semaphore ID and SETVAL in audit record */
913 	snprintf(ipcregex, sizeof(ipcregex),
914 		"semctl.*SETVAL.*%d.*return,success", semid);
915 	check_audit(fds, ipcregex, pipefd);
916 
917 	/* Destroy the semaphore set with ID = semid */
918 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
919 }
920 
921 ATF_TC_CLEANUP(semctl_setval_success, tc)
922 {
923 	cleanup();
924 }
925 
926 
927 ATF_TC_WITH_CLEANUP(semctl_setval_failure);
928 ATF_TC_HEAD(semctl_setval_failure, tc)
929 {
930 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
931 					"semctl(2) call for SETVAL command");
932 }
933 
934 ATF_TC_BODY(semctl_setval_failure, tc)
935 {
936 	const char *regex = "semctl.*SETVAL.*return,failure : Invalid argument";
937 	FILE *pipefd = setup(fds, auclass);
938 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, SETVAL, semarg));
939 	check_audit(fds, regex, pipefd);
940 }
941 
942 ATF_TC_CLEANUP(semctl_setval_failure, tc)
943 {
944 	cleanup();
945 }
946 
947 
948 ATF_TC_WITH_CLEANUP(semctl_getpid_success);
949 ATF_TC_HEAD(semctl_getpid_success, tc)
950 {
951 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
952 					"semctl(2) call for GETPID command");
953 }
954 
955 ATF_TC_BODY(semctl_getpid_success, tc)
956 {
957 	/* Create a semaphore set and obtain the set identifier */
958 	ATF_REQUIRE((semid =
959 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
960 
961 	FILE *pipefd = setup(fds, auclass);
962 	ATF_REQUIRE_EQ(0, semctl(semid, 0, GETPID));
963 	/* Check the presence of semaphore ID and GETVAL in audit record */
964 	snprintf(ipcregex, sizeof(ipcregex),
965 		"semctl.*GETPID.*%d.*return,success", semid);
966 	check_audit(fds, ipcregex, pipefd);
967 
968 	/* Destroy the semaphore set with ID = semid */
969 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
970 }
971 
972 ATF_TC_CLEANUP(semctl_getpid_success, tc)
973 {
974 	cleanup();
975 }
976 
977 
978 ATF_TC_WITH_CLEANUP(semctl_getpid_failure);
979 ATF_TC_HEAD(semctl_getpid_failure, tc)
980 {
981 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
982 					"semctl(2) call for GETPID command");
983 }
984 
985 ATF_TC_BODY(semctl_getpid_failure, tc)
986 {
987 	const char *regex = "semctl.*GETPID.*return,failure : Invalid argument";
988 	FILE *pipefd = setup(fds, auclass);
989 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETPID));
990 	check_audit(fds, regex, pipefd);
991 }
992 
993 ATF_TC_CLEANUP(semctl_getpid_failure, tc)
994 {
995 	cleanup();
996 }
997 
998 
999 ATF_TC_WITH_CLEANUP(semctl_getncnt_success);
1000 ATF_TC_HEAD(semctl_getncnt_success, tc)
1001 {
1002 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1003 					"semctl(2) call for GETNCNT command");
1004 }
1005 
1006 ATF_TC_BODY(semctl_getncnt_success, tc)
1007 {
1008 	/* Create a semaphore set and obtain the set identifier */
1009 	ATF_REQUIRE((semid =
1010 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1011 
1012 	FILE *pipefd = setup(fds, auclass);
1013 	ATF_REQUIRE_EQ(0, semctl(semid, 0, GETNCNT));
1014 	/* Check the presence of semaphore ID and GETNCNT in audit record */
1015 	snprintf(ipcregex, sizeof(ipcregex),
1016 		"semctl.*GETNCNT.*%d.*return,success", semid);
1017 	check_audit(fds, ipcregex, pipefd);
1018 
1019 	/* Destroy the semaphore set with ID = semid */
1020 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1021 }
1022 
1023 ATF_TC_CLEANUP(semctl_getncnt_success, tc)
1024 {
1025 	cleanup();
1026 }
1027 
1028 
1029 ATF_TC_WITH_CLEANUP(semctl_getncnt_failure);
1030 ATF_TC_HEAD(semctl_getncnt_failure, tc)
1031 {
1032 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1033 					"semctl(2) call for GETNCNT command");
1034 }
1035 
1036 ATF_TC_BODY(semctl_getncnt_failure, tc)
1037 {
1038 	const char *regex = "semctl.*GETNCNT.*return,failure.*Invalid argument";
1039 	FILE *pipefd = setup(fds, auclass);
1040 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETNCNT));
1041 	check_audit(fds, regex, pipefd);
1042 }
1043 
1044 ATF_TC_CLEANUP(semctl_getncnt_failure, tc)
1045 {
1046 	cleanup();
1047 }
1048 
1049 
1050 ATF_TC_WITH_CLEANUP(semctl_getzcnt_success);
1051 ATF_TC_HEAD(semctl_getzcnt_success, tc)
1052 {
1053 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1054 					"semctl(2) call for GETZCNT command");
1055 }
1056 
1057 ATF_TC_BODY(semctl_getzcnt_success, tc)
1058 {
1059 	/* Create a semaphore set and obtain the set identifier */
1060 	ATF_REQUIRE((semid =
1061 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1062 
1063 	FILE *pipefd = setup(fds, auclass);
1064 	ATF_REQUIRE_EQ(0, semctl(semid, 0, GETZCNT));
1065 	/* Check the presence of semaphore ID and GETZCNT in audit record */
1066 	snprintf(ipcregex, sizeof(ipcregex),
1067 		"semctl.*GETZCNT.*%d.*return,success", semid);
1068 	check_audit(fds, ipcregex, pipefd);
1069 
1070 	/* Destroy the semaphore set with ID = semid */
1071 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1072 }
1073 
1074 ATF_TC_CLEANUP(semctl_getzcnt_success, tc)
1075 {
1076 	cleanup();
1077 }
1078 
1079 
1080 ATF_TC_WITH_CLEANUP(semctl_getzcnt_failure);
1081 ATF_TC_HEAD(semctl_getzcnt_failure, tc)
1082 {
1083 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1084 					"semctl(2) call for GETZCNT command");
1085 }
1086 
1087 ATF_TC_BODY(semctl_getzcnt_failure, tc)
1088 {
1089 	const char *regex = "semctl.*GETZCNT.*return,failure.*Invalid argument";
1090 	FILE *pipefd = setup(fds, auclass);
1091 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETZCNT));
1092 	check_audit(fds, regex, pipefd);
1093 }
1094 
1095 ATF_TC_CLEANUP(semctl_getzcnt_failure, tc)
1096 {
1097 	cleanup();
1098 }
1099 
1100 
1101 ATF_TC_WITH_CLEANUP(semctl_getall_success);
1102 ATF_TC_HEAD(semctl_getall_success, tc)
1103 {
1104 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1105 					"semctl(2) call for GETALL command");
1106 }
1107 
1108 ATF_TC_BODY(semctl_getall_success, tc)
1109 {
1110 	/* Create a semaphore set and obtain the set identifier */
1111 	ATF_REQUIRE((semid =
1112 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1113 
1114 	semarg.array = semvals;
1115 	FILE *pipefd = setup(fds, auclass);
1116 	ATF_REQUIRE(semctl(semid, 0, GETALL, semarg) != -1);
1117 	/* Check the presence of semaphore ID and GETALL in audit record */
1118 	snprintf(ipcregex, sizeof(ipcregex),
1119 		"semctl.*GETALL.*%d.*return,success", semid);
1120 	check_audit(fds, ipcregex, pipefd);
1121 
1122 	/* Destroy the semaphore set with ID = semid */
1123 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1124 }
1125 
1126 ATF_TC_CLEANUP(semctl_getall_success, tc)
1127 {
1128 	cleanup();
1129 }
1130 
1131 
1132 ATF_TC_WITH_CLEANUP(semctl_getall_failure);
1133 ATF_TC_HEAD(semctl_getall_failure, tc)
1134 {
1135 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1136 					"semctl(2) call for GETALL command");
1137 }
1138 
1139 ATF_TC_BODY(semctl_getall_failure, tc)
1140 {
1141 	const char *regex = "semctl.*GETALL.*return,failure : Invalid argument";
1142 	FILE *pipefd = setup(fds, auclass);
1143 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETALL, semarg));
1144 	check_audit(fds, regex, pipefd);
1145 }
1146 
1147 ATF_TC_CLEANUP(semctl_getall_failure, tc)
1148 {
1149 	cleanup();
1150 }
1151 
1152 
1153 ATF_TC_WITH_CLEANUP(semctl_setall_success);
1154 ATF_TC_HEAD(semctl_setall_success, tc)
1155 {
1156 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1157 					"semctl(2) call for SETALL command");
1158 }
1159 
1160 ATF_TC_BODY(semctl_setall_success, tc)
1161 {
1162 	/* Create a semaphore set and obtain the set identifier */
1163 	ATF_REQUIRE((semid =
1164 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1165 
1166 	semarg.array = semvals;
1167 	/* Initialize semvals to be used with SETALL */
1168 	ATF_REQUIRE(semctl(semid, 0, GETALL, semarg) != -1);
1169 
1170 	FILE *pipefd = setup(fds, auclass);
1171 	ATF_REQUIRE_EQ(0, semctl(semid, 0, SETALL, semarg));
1172 	/* Check the presence of semaphore ID and SETALL in audit record */
1173 	snprintf(ipcregex, sizeof(ipcregex),
1174 		"semctl.*SETALL.*%d.*return,success", semid);
1175 	check_audit(fds, ipcregex, pipefd);
1176 
1177 	/* Destroy the semaphore set with ID = semid */
1178 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1179 }
1180 
1181 ATF_TC_CLEANUP(semctl_setall_success, tc)
1182 {
1183 	cleanup();
1184 }
1185 
1186 
1187 ATF_TC_WITH_CLEANUP(semctl_setall_failure);
1188 ATF_TC_HEAD(semctl_setall_failure, tc)
1189 {
1190 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1191 					"semctl(2) call for SETALL command");
1192 }
1193 
1194 ATF_TC_BODY(semctl_setall_failure, tc)
1195 {
1196 	const char *regex = "semctl.*SETALL.*return,failure : Invalid argument";
1197 	FILE *pipefd = setup(fds, auclass);
1198 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, SETALL, semarg));
1199 	check_audit(fds, regex, pipefd);
1200 }
1201 
1202 ATF_TC_CLEANUP(semctl_setall_failure, tc)
1203 {
1204 	cleanup();
1205 }
1206 
1207 
1208 ATF_TC_WITH_CLEANUP(semctl_stat_success);
1209 ATF_TC_HEAD(semctl_stat_success, tc)
1210 {
1211 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1212 					"semctl(2) call for IPC_STAT command");
1213 }
1214 
1215 ATF_TC_BODY(semctl_stat_success, tc)
1216 {
1217 	/* Create a semaphore set and obtain the set identifier */
1218 	ATF_REQUIRE((semid =
1219 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1220 
1221 	semarg.buf = &sembuff;
1222 	FILE *pipefd = setup(fds, auclass);
1223 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_STAT, semarg));
1224 	/* Check the presence of semaphore ID and IPC_STAT in audit record */
1225 	snprintf(ipcregex, sizeof(ipcregex),
1226 		"semctl.*IPC_STAT.*%d.*return,success", semid);
1227 	check_audit(fds, ipcregex, pipefd);
1228 
1229 	/* Destroy the semaphore set with ID = semid */
1230 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1231 }
1232 
1233 ATF_TC_CLEANUP(semctl_stat_success, tc)
1234 {
1235 	cleanup();
1236 }
1237 
1238 
1239 ATF_TC_WITH_CLEANUP(semctl_stat_failure);
1240 ATF_TC_HEAD(semctl_stat_failure, tc)
1241 {
1242 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1243 					"semctl(2) call for IPC_STAT command");
1244 }
1245 
1246 ATF_TC_BODY(semctl_stat_failure, tc)
1247 {
1248 	const char *regex = "semctl.*IPC_STAT.*return,fail.*Invalid argument";
1249 	FILE *pipefd = setup(fds, auclass);
1250 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, IPC_STAT, semarg));
1251 	check_audit(fds, regex, pipefd);
1252 }
1253 
1254 ATF_TC_CLEANUP(semctl_stat_failure, tc)
1255 {
1256 	cleanup();
1257 }
1258 
1259 
1260 ATF_TC_WITH_CLEANUP(semctl_set_success);
1261 ATF_TC_HEAD(semctl_set_success, tc)
1262 {
1263 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1264 					"semctl(2) call for IPC_SET command");
1265 }
1266 
1267 ATF_TC_BODY(semctl_set_success, tc)
1268 {
1269 	/* Create a semaphore set and obtain the set identifier */
1270 	ATF_REQUIRE((semid =
1271 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1272 
1273 	semarg.buf = &sembuff;
1274 	/* Fill up the sembuff structure to be used with IPC_SET */
1275 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_STAT, semarg));
1276 
1277 	FILE *pipefd = setup(fds, auclass);
1278 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_SET, semarg));
1279 	/* Check the presence of semaphore ID and IPC_SET in audit record */
1280 	snprintf(ipcregex, sizeof(ipcregex),
1281 		"semctl.*IPC_SET.*%d.*return,success", semid);
1282 	check_audit(fds, ipcregex, pipefd);
1283 
1284 	/* Destroy the semaphore set with ID = semid */
1285 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1286 }
1287 
1288 ATF_TC_CLEANUP(semctl_set_success, tc)
1289 {
1290 	cleanup();
1291 }
1292 
1293 
1294 ATF_TC_WITH_CLEANUP(semctl_set_failure);
1295 ATF_TC_HEAD(semctl_set_failure, tc)
1296 {
1297 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1298 					"semctl(2) call for IPC_SET command");
1299 }
1300 
1301 ATF_TC_BODY(semctl_set_failure, tc)
1302 {
1303 	/* Create a semaphore set and obtain the set identifier */
1304 	ATF_REQUIRE((semid =
1305 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1306 
1307 	semarg.buf = &sembuff;
1308 	/* Fill up the sembuff structure to be used with IPC_SET */
1309 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_STAT, semarg));
1310 
1311 	const char *regex = "semctl.*IPC_SET.*return,failure.*Invalid argument";
1312 	FILE *pipefd = setup(fds, auclass);
1313 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, IPC_SET, semarg));
1314 	check_audit(fds, regex, pipefd);
1315 
1316 	/* Destroy the semaphore set with ID = semid */
1317 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1318 }
1319 
1320 ATF_TC_CLEANUP(semctl_set_failure, tc)
1321 {
1322 	cleanup();
1323 }
1324 
1325 
1326 ATF_TC_WITH_CLEANUP(semctl_rmid_success);
1327 ATF_TC_HEAD(semctl_rmid_success, tc)
1328 {
1329 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1330 					"semctl(2) call for IPC_RMID command");
1331 }
1332 
1333 ATF_TC_BODY(semctl_rmid_success, tc)
1334 {
1335 	/* Create a semaphore set and obtain the set identifier */
1336 	ATF_REQUIRE((semid =
1337 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1338 
1339 	FILE *pipefd = setup(fds, auclass);
1340 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID, semarg));
1341 	/* Check the presence of semaphore ID and IPC_RMID in audit record */
1342 	snprintf(ipcregex, sizeof(ipcregex),
1343 		"semctl.*IPC_RMID.*%d.*return,success", semid);
1344 	check_audit(fds, ipcregex, pipefd);
1345 }
1346 
1347 ATF_TC_CLEANUP(semctl_rmid_success, tc)
1348 {
1349 	cleanup();
1350 }
1351 
1352 
1353 ATF_TC_WITH_CLEANUP(semctl_rmid_failure);
1354 ATF_TC_HEAD(semctl_rmid_failure, tc)
1355 {
1356 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1357 					"semctl(2) call for IPC_RMID command");
1358 }
1359 
1360 ATF_TC_BODY(semctl_rmid_failure, tc)
1361 {
1362 	const char *regex = "semctl.*IPC_RMID.*return,fail.*Invalid argument";
1363 	FILE *pipefd = setup(fds, auclass);
1364 	ATF_REQUIRE_EQ(-1, semctl(-1, 0, IPC_RMID, semarg));
1365 	check_audit(fds, regex, pipefd);
1366 }
1367 
1368 ATF_TC_CLEANUP(semctl_rmid_failure, tc)
1369 {
1370 	cleanup();
1371 }
1372 
1373 
1374 ATF_TC_WITH_CLEANUP(semctl_illegal_command);
1375 ATF_TC_HEAD(semctl_illegal_command, tc)
1376 {
1377 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1378 					"semctl(2) call for illegal cmd value");
1379 }
1380 
1381 ATF_TC_BODY(semctl_illegal_command, tc)
1382 {
1383 	/* Create a semaphore set and obtain the set identifier */
1384 	ATF_REQUIRE((semid =
1385 		semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1386 
1387 	const char *regex = "semctl.*illegal command.*fail.*Invalid argument";
1388 	FILE *pipefd = setup(fds, auclass);
1389 	ATF_REQUIRE_EQ(-1, semctl(semid, 0, -1));
1390 	check_audit(fds, regex, pipefd);
1391 
1392 	/* Destroy the semaphore set with ID = semid */
1393 	ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1394 }
1395 
1396 ATF_TC_CLEANUP(semctl_illegal_command, tc)
1397 {
1398 	cleanup();
1399 }
1400 
1401 
1402 ATF_TC_WITH_CLEANUP(shm_open_success);
1403 ATF_TC_HEAD(shm_open_success, tc)
1404 {
1405 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1406 					"shm_open(2) call");
1407 }
1408 
1409 ATF_TC_BODY(shm_open_success, tc)
1410 {
1411 	pid = getpid();
1412 	snprintf(ipcregex, sizeof(ipcregex), "shm_open.*%d.*ret.*success", pid);
1413 
1414 	FILE *pipefd = setup(fds, auclass);
1415 	ATF_REQUIRE(shm_open(SHM_ANON, O_CREAT | O_TRUNC | O_RDWR, 0600) != -1);
1416 	check_audit(fds, ipcregex, pipefd);
1417 }
1418 
1419 ATF_TC_CLEANUP(shm_open_success, tc)
1420 {
1421 	cleanup();
1422 }
1423 
1424 
1425 ATF_TC_WITH_CLEANUP(shm_open_failure);
1426 ATF_TC_HEAD(shm_open_failure, tc)
1427 {
1428 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1429 					"shm_open(2) call");
1430 }
1431 
1432 ATF_TC_BODY(shm_open_failure, tc)
1433 {
1434 	const char *regex = "shm_open.*fileforaudit.*return,failure";
1435 	FILE *pipefd = setup(fds, auclass);
1436 	/* Failure reason: File does not exist */
1437 	ATF_REQUIRE_EQ(-1, shm_open(path, O_TRUNC | O_RDWR, 0600));
1438 	check_audit(fds, regex, pipefd);
1439 }
1440 
1441 ATF_TC_CLEANUP(shm_open_failure, tc)
1442 {
1443 	cleanup();
1444 }
1445 
1446 
1447 ATF_TC_WITH_CLEANUP(shm_unlink_success);
1448 ATF_TC_HEAD(shm_unlink_success, tc)
1449 {
1450 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1451 					"shm_unlink(2) call");
1452 }
1453 
1454 ATF_TC_BODY(shm_unlink_success, tc)
1455 {
1456 	/* Build an absolute path to a file in the test-case directory */
1457 	char dirpath[PATH_MAX];
1458 	ATF_REQUIRE(getcwd(dirpath, sizeof(dirpath)) != NULL);
1459 	strlcat(dirpath, path, sizeof(dirpath));
1460 	ATF_REQUIRE(shm_open(dirpath, O_CREAT | O_TRUNC | O_RDWR, 0600) != -1);
1461 
1462 	const char *regex = "shm_unlink.*fileforaudit.*return,success";
1463 	FILE *pipefd = setup(fds, auclass);
1464 	ATF_REQUIRE_EQ(0, shm_unlink(dirpath));
1465 	check_audit(fds, regex, pipefd);
1466 }
1467 
1468 ATF_TC_CLEANUP(shm_unlink_success, tc)
1469 {
1470 	cleanup();
1471 }
1472 
1473 
1474 ATF_TC_WITH_CLEANUP(shm_unlink_failure);
1475 ATF_TC_HEAD(shm_unlink_failure, tc)
1476 {
1477 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1478 					"shm_unlink(2) call");
1479 }
1480 
1481 ATF_TC_BODY(shm_unlink_failure, tc)
1482 {
1483 	const char *regex = "shm_unlink.*fileforaudit.*return,failure";
1484 	FILE *pipefd = setup(fds, auclass);
1485 	ATF_REQUIRE_EQ(-1, shm_unlink(path));
1486 	check_audit(fds, regex, pipefd);
1487 }
1488 
1489 ATF_TC_CLEANUP(shm_unlink_failure, tc)
1490 {
1491 	cleanup();
1492 }
1493 
1494 
1495 ATF_TC_WITH_CLEANUP(pipe_success);
1496 ATF_TC_HEAD(pipe_success, tc)
1497 {
1498 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1499 					"pipe(2) call");
1500 }
1501 
1502 ATF_TC_BODY(pipe_success, tc)
1503 {
1504 	int filedesc[2];
1505 	pid = getpid();
1506 	snprintf(ipcregex, sizeof(ipcregex), "pipe.*%d.*return,success", pid);
1507 	FILE *pipefd = setup(fds, auclass);
1508 	ATF_REQUIRE_EQ(0, pipe(filedesc));
1509 	check_audit(fds, ipcregex, pipefd);
1510 
1511 	close(filedesc[0]);
1512 	close(filedesc[1]);
1513 }
1514 
1515 ATF_TC_CLEANUP(pipe_success, tc)
1516 {
1517 	cleanup();
1518 }
1519 
1520 
1521 ATF_TC_WITH_CLEANUP(pipe_failure);
1522 ATF_TC_HEAD(pipe_failure, tc)
1523 {
1524 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1525 					"pipe(2) call");
1526 }
1527 
1528 ATF_TC_BODY(pipe_failure, tc)
1529 {
1530 	pid = getpid();
1531 	snprintf(ipcregex, sizeof(ipcregex), "pipe.*%d.*return.failure", pid);
1532 
1533 	FILE *pipefd = setup(fds, auclass);
1534 	ATF_REQUIRE_EQ(-1, pipe(NULL));
1535 	check_audit(fds, ipcregex, pipefd);
1536 }
1537 
1538 ATF_TC_CLEANUP(pipe_failure, tc)
1539 {
1540 	cleanup();
1541 }
1542 
1543 
1544 ATF_TC_WITH_CLEANUP(posix_openpt_success);
1545 ATF_TC_HEAD(posix_openpt_success, tc)
1546 {
1547 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1548 					"posix_openpt(2) call");
1549 }
1550 
1551 ATF_TC_BODY(posix_openpt_success, tc)
1552 {
1553 	int filedesc;
1554 	FILE *pipefd = setup(fds, auclass);
1555 	ATF_REQUIRE((filedesc = posix_openpt(O_RDWR | O_NOCTTY)) != -1);
1556 	/* Check for the presence of filedesc in the audit record */
1557 	snprintf(ipcregex, sizeof(ipcregex),
1558 		"posix_openpt.*return,success,%d", filedesc);
1559 	check_audit(fds, ipcregex, pipefd);
1560 	close(filedesc);
1561 }
1562 
1563 ATF_TC_CLEANUP(posix_openpt_success, tc)
1564 {
1565 	cleanup();
1566 }
1567 
1568 
1569 ATF_TC_WITH_CLEANUP(posix_openpt_failure);
1570 ATF_TC_HEAD(posix_openpt_failure, tc)
1571 {
1572 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1573 					"posix_openpt(2) call");
1574 }
1575 
1576 ATF_TC_BODY(posix_openpt_failure, tc)
1577 {
1578 	const char *regex = "posix_openpt.*return,failure : Invalid argument";
1579 	FILE *pipefd = setup(fds, auclass);
1580 	ATF_REQUIRE_EQ(-1, posix_openpt(-1));
1581 	check_audit(fds, regex, pipefd);
1582 }
1583 
1584 ATF_TC_CLEANUP(posix_openpt_failure, tc)
1585 {
1586 	cleanup();
1587 }
1588 
1589 
1590 ATF_TP_ADD_TCS(tp)
1591 {
1592 	ATF_TP_ADD_TC(tp, msgget_success);
1593 	ATF_TP_ADD_TC(tp, msgget_failure);
1594 	ATF_TP_ADD_TC(tp, msgsnd_success);
1595 	ATF_TP_ADD_TC(tp, msgsnd_failure);
1596 	ATF_TP_ADD_TC(tp, msgrcv_success);
1597 	ATF_TP_ADD_TC(tp, msgrcv_failure);
1598 
1599 	ATF_TP_ADD_TC(tp, msgctl_rmid_success);
1600 	ATF_TP_ADD_TC(tp, msgctl_rmid_failure);
1601 	ATF_TP_ADD_TC(tp, msgctl_stat_success);
1602 	ATF_TP_ADD_TC(tp, msgctl_stat_failure);
1603 	ATF_TP_ADD_TC(tp, msgctl_set_success);
1604 	ATF_TP_ADD_TC(tp, msgctl_set_failure);
1605 	ATF_TP_ADD_TC(tp, msgctl_illegal_command);
1606 
1607 	ATF_TP_ADD_TC(tp, shmget_success);
1608 	ATF_TP_ADD_TC(tp, shmget_failure);
1609 	ATF_TP_ADD_TC(tp, shmat_success);
1610 	ATF_TP_ADD_TC(tp, shmat_failure);
1611 	ATF_TP_ADD_TC(tp, shmdt_success);
1612 	ATF_TP_ADD_TC(tp, shmdt_failure);
1613 
1614 	ATF_TP_ADD_TC(tp, shmctl_rmid_success);
1615 	ATF_TP_ADD_TC(tp, shmctl_rmid_failure);
1616 	ATF_TP_ADD_TC(tp, shmctl_stat_success);
1617 	ATF_TP_ADD_TC(tp, shmctl_stat_failure);
1618 	ATF_TP_ADD_TC(tp, shmctl_set_success);
1619 	ATF_TP_ADD_TC(tp, shmctl_set_failure);
1620 	ATF_TP_ADD_TC(tp, shmctl_illegal_command);
1621 
1622 	ATF_TP_ADD_TC(tp, semget_success);
1623 	ATF_TP_ADD_TC(tp, semget_failure);
1624 	ATF_TP_ADD_TC(tp, semop_success);
1625 	ATF_TP_ADD_TC(tp, semop_failure);
1626 
1627 	ATF_TP_ADD_TC(tp, semctl_getval_success);
1628 	ATF_TP_ADD_TC(tp, semctl_getval_failure);
1629 	ATF_TP_ADD_TC(tp, semctl_setval_success);
1630 	ATF_TP_ADD_TC(tp, semctl_setval_failure);
1631 	ATF_TP_ADD_TC(tp, semctl_getpid_success);
1632 	ATF_TP_ADD_TC(tp, semctl_getpid_failure);
1633 	ATF_TP_ADD_TC(tp, semctl_getncnt_success);
1634 	ATF_TP_ADD_TC(tp, semctl_getncnt_failure);
1635 	ATF_TP_ADD_TC(tp, semctl_getzcnt_success);
1636 	ATF_TP_ADD_TC(tp, semctl_getzcnt_failure);
1637 	ATF_TP_ADD_TC(tp, semctl_getall_success);
1638 	ATF_TP_ADD_TC(tp, semctl_getall_failure);
1639 	ATF_TP_ADD_TC(tp, semctl_setall_success);
1640 	ATF_TP_ADD_TC(tp, semctl_setall_failure);
1641 	ATF_TP_ADD_TC(tp, semctl_stat_success);
1642 	ATF_TP_ADD_TC(tp, semctl_stat_failure);
1643 	ATF_TP_ADD_TC(tp, semctl_set_success);
1644 	ATF_TP_ADD_TC(tp, semctl_set_failure);
1645 	ATF_TP_ADD_TC(tp, semctl_rmid_success);
1646 	ATF_TP_ADD_TC(tp, semctl_rmid_failure);
1647 	ATF_TP_ADD_TC(tp, semctl_illegal_command);
1648 
1649 	ATF_TP_ADD_TC(tp, shm_open_success);
1650 	ATF_TP_ADD_TC(tp, shm_open_failure);
1651 	ATF_TP_ADD_TC(tp, shm_unlink_success);
1652 	ATF_TP_ADD_TC(tp, shm_unlink_failure);
1653 
1654 	ATF_TP_ADD_TC(tp, pipe_success);
1655 	ATF_TP_ADD_TC(tp, pipe_failure);
1656 	ATF_TP_ADD_TC(tp, posix_openpt_success);
1657 	ATF_TP_ADD_TC(tp, posix_openpt_failure);
1658 
1659 	return (atf_no_error());
1660 }
1661