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