2 * Copyright (c) 2018 Aniket Pandey
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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
26 #include <sys/types.h>
47 typedef struct msgstr msgstr_t;
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];
62 ATF_TC_WITH_CLEANUP(msgget_success);
63 ATF_TC_HEAD(msgget_success, tc)
65 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
69 ATF_TC_BODY(msgget_success, tc)
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);
79 /* Destroy the message queue with ID = msqid */
80 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
83 ATF_TC_CLEANUP(msgget_success, tc)
89 ATF_TC_WITH_CLEANUP(msgget_failure);
90 ATF_TC_HEAD(msgget_failure, tc)
92 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
96 ATF_TC_BODY(msgget_failure, tc)
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);
104 ATF_TC_CLEANUP(msgget_failure, tc)
110 ATF_TC_WITH_CLEANUP(msgsnd_success);
111 ATF_TC_HEAD(msgsnd_success, tc)
113 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
117 ATF_TC_BODY(msgsnd_success, tc)
119 /* Create a message queue and obtain the corresponding identifier */
120 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
122 /* Initialize a msgstr_t structure to store message */
125 memset(msg.mtext, 0, BUFFSIZE);
127 /* Check the presence of message queue ID in audit record */
128 snprintf(ipcregex, sizeof(ipcregex),
129 "msgsnd.*Message IPC.*%d.*return,success", msqid);
131 FILE *pipefd = setup(fds, auclass);
132 ATF_REQUIRE_EQ(0, msgsnd(msqid, &msg, BUFFSIZE, IPC_NOWAIT));
133 check_audit(fds, ipcregex, pipefd);
135 /* Destroy the message queue with ID = msqid */
136 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
139 ATF_TC_CLEANUP(msgsnd_success, tc)
145 ATF_TC_WITH_CLEANUP(msgsnd_failure);
146 ATF_TC_HEAD(msgsnd_failure, tc)
148 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
152 ATF_TC_BODY(msgsnd_failure, tc)
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);
160 ATF_TC_CLEANUP(msgsnd_failure, tc)
166 ATF_TC_WITH_CLEANUP(msgrcv_success);
167 ATF_TC_HEAD(msgrcv_success, tc)
169 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
173 ATF_TC_BODY(msgrcv_success, tc)
176 /* Create a message queue and obtain the corresponding identifier */
177 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
179 /* Initialize two msgstr_t structures to store respective messages */
182 memset(msg1.mtext, 0, BUFFSIZE);
184 /* Send a message to the queue with ID = msqid */
185 ATF_REQUIRE_EQ(0, msgsnd(msqid, &msg1, BUFFSIZE, IPC_NOWAIT));
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);
195 /* Destroy the message queue with ID = msqid */
196 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
199 ATF_TC_CLEANUP(msgrcv_success, tc)
205 ATF_TC_WITH_CLEANUP(msgrcv_failure);
206 ATF_TC_HEAD(msgrcv_failure, tc)
208 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
212 ATF_TC_BODY(msgrcv_failure, tc)
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);
220 ATF_TC_CLEANUP(msgrcv_failure, tc)
226 ATF_TC_WITH_CLEANUP(msgctl_rmid_success);
227 ATF_TC_HEAD(msgctl_rmid_success, tc)
229 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
230 "msgctl(2) call for IPC_RMID command");
233 ATF_TC_BODY(msgctl_rmid_success, tc)
235 /* Create a message queue and obtain the corresponding identifier */
236 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
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);
246 ATF_TC_CLEANUP(msgctl_rmid_success, tc)
252 ATF_TC_WITH_CLEANUP(msgctl_rmid_failure);
253 ATF_TC_HEAD(msgctl_rmid_failure, tc)
255 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
256 "msgctl(2) call for IPC_RMID command");
259 ATF_TC_BODY(msgctl_rmid_failure, tc)
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);
267 ATF_TC_CLEANUP(msgctl_rmid_failure, tc)
273 ATF_TC_WITH_CLEANUP(msgctl_stat_success);
274 ATF_TC_HEAD(msgctl_stat_success, tc)
276 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
277 "msgctl(2) call for IPC_STAT command");
280 ATF_TC_BODY(msgctl_stat_success, tc)
282 /* Create a message queue and obtain the corresponding identifier */
283 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
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);
292 /* Destroy the message queue with ID = msqid */
293 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
296 ATF_TC_CLEANUP(msgctl_stat_success, tc)
302 ATF_TC_WITH_CLEANUP(msgctl_stat_failure);
303 ATF_TC_HEAD(msgctl_stat_failure, tc)
305 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
306 "msgctl(2) call for IPC_STAT command");
309 ATF_TC_BODY(msgctl_stat_failure, tc)
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);
317 ATF_TC_CLEANUP(msgctl_stat_failure, tc)
323 ATF_TC_WITH_CLEANUP(msgctl_set_success);
324 ATF_TC_HEAD(msgctl_set_success, tc)
326 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
327 "msgctl(2) call for IPC_SET command");
330 ATF_TC_BODY(msgctl_set_success, tc)
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));
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);
344 /* Destroy the message queue with ID = msqid */
345 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
348 ATF_TC_CLEANUP(msgctl_set_success, tc)
354 ATF_TC_WITH_CLEANUP(msgctl_set_failure);
355 ATF_TC_HEAD(msgctl_set_failure, tc)
357 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
358 "msgctl(2) call for IPC_SET command");
361 ATF_TC_BODY(msgctl_set_failure, tc)
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);
369 ATF_TC_CLEANUP(msgctl_set_failure, tc)
375 ATF_TC_WITH_CLEANUP(msgctl_illegal_command);
376 ATF_TC_HEAD(msgctl_illegal_command, tc)
378 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
379 "msgctl(2) call for illegal cmd value");
382 ATF_TC_BODY(msgctl_illegal_command, tc)
384 /* Create a message queue and obtain the corresponding identifier */
385 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
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);
392 /* Destroy the message queue with ID = msqid */
393 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
396 ATF_TC_CLEANUP(msgctl_illegal_command, tc)
402 ATF_TC_WITH_CLEANUP(shmget_success);
403 ATF_TC_HEAD(shmget_success, tc)
405 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
409 ATF_TC_BODY(shmget_success, tc)
411 FILE *pipefd = setup(fds, auclass);
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);
418 /* Destroy the shared memory with ID = shmid */
419 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
422 ATF_TC_CLEANUP(shmget_success, tc)
428 ATF_TC_WITH_CLEANUP(shmget_failure);
429 ATF_TC_HEAD(shmget_failure, tc)
431 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
435 ATF_TC_BODY(shmget_failure, tc)
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);
443 ATF_TC_CLEANUP(shmget_failure, tc)
449 ATF_TC_WITH_CLEANUP(shmat_success);
450 ATF_TC_HEAD(shmat_success, tc)
452 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
456 ATF_TC_BODY(shmat_success, tc)
459 /* Create a shared memory segment and obtain the identifier */
461 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
463 FILE *pipefd = setup(fds, auclass);
464 ATF_REQUIRE((intptr_t)(addr = shmat(shmid, NULL, 0)) != -1);
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);
471 /* Destroy the shared memory with ID = shmid */
472 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
475 ATF_TC_CLEANUP(shmat_success, tc)
481 ATF_TC_WITH_CLEANUP(shmat_failure);
482 ATF_TC_HEAD(shmat_failure, tc)
484 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
488 ATF_TC_BODY(shmat_failure, tc)
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);
496 ATF_TC_CLEANUP(shmat_failure, tc)
502 ATF_TC_WITH_CLEANUP(shmdt_success);
503 ATF_TC_HEAD(shmdt_success, tc)
505 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
509 ATF_TC_BODY(shmdt_success, tc)
513 snprintf(ipcregex, sizeof(ipcregex), "shmdt.*%d.*return,success", pid);
515 /* Create a shared memory segment and obtain the identifier */
517 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
519 /* Attach the shared memory to calling process's address space */
520 ATF_REQUIRE((intptr_t)(addr = shmat(shmid, NULL, 0)) != -1);
522 FILE *pipefd = setup(fds, auclass);
523 ATF_REQUIRE_EQ(0, shmdt(addr));
524 check_audit(fds, ipcregex, pipefd);
526 /* Destroy the shared memory with ID = shmid */
527 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
530 ATF_TC_CLEANUP(shmdt_success, tc)
536 ATF_TC_WITH_CLEANUP(shmdt_failure);
537 ATF_TC_HEAD(shmdt_failure, tc)
539 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
543 ATF_TC_BODY(shmdt_failure, tc)
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);
551 ATF_TC_CLEANUP(shmdt_failure, tc)
557 ATF_TC_WITH_CLEANUP(shmctl_rmid_success);
558 ATF_TC_HEAD(shmctl_rmid_success, tc)
560 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
561 "shmctl(2) call for IPC_RMID command");
564 ATF_TC_BODY(shmctl_rmid_success, tc)
566 /* Create a shared memory segment and obtain the identifier */
568 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
578 ATF_TC_CLEANUP(shmctl_rmid_success, tc)
584 ATF_TC_WITH_CLEANUP(shmctl_rmid_failure);
585 ATF_TC_HEAD(shmctl_rmid_failure, tc)
587 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
588 "shmctl(2) call for IPC_RMID command");
591 ATF_TC_BODY(shmctl_rmid_failure, tc)
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);
599 ATF_TC_CLEANUP(shmctl_rmid_failure, tc)
605 ATF_TC_WITH_CLEANUP(shmctl_stat_success);
606 ATF_TC_HEAD(shmctl_stat_success, tc)
608 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
609 "shmctl(2) call for IPC_STAT command");
612 ATF_TC_BODY(shmctl_stat_success, tc)
614 /* Create a shared memory segment and obtain the identifier */
616 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
625 /* Destroy the shared memory with ID = shmid */
626 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
629 ATF_TC_CLEANUP(shmctl_stat_success, tc)
635 ATF_TC_WITH_CLEANUP(shmctl_stat_failure);
636 ATF_TC_HEAD(shmctl_stat_failure, tc)
638 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
639 "shmctl(2) call for IPC_STAT command");
642 ATF_TC_BODY(shmctl_stat_failure, tc)
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);
650 ATF_TC_CLEANUP(shmctl_stat_failure, tc)
656 ATF_TC_WITH_CLEANUP(shmctl_set_success);
657 ATF_TC_HEAD(shmctl_set_success, tc)
659 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
660 "shmctl(2) call for IPC_SET command");
663 ATF_TC_BODY(shmctl_set_success, tc)
665 /* Create a shared memory segment and obtain the identifier */
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));
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);
678 /* Destroy the shared memory with ID = shmid */
679 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
682 ATF_TC_CLEANUP(shmctl_set_success, tc)
688 ATF_TC_WITH_CLEANUP(shmctl_set_failure);
689 ATF_TC_HEAD(shmctl_set_failure, tc)
691 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
692 "shmctl(2) call for IPC_SET command");
695 ATF_TC_BODY(shmctl_set_failure, tc)
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);
703 ATF_TC_CLEANUP(shmctl_set_failure, tc)
709 ATF_TC_WITH_CLEANUP(shmctl_illegal_command);
710 ATF_TC_HEAD(shmctl_illegal_command, tc)
712 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
713 "shmctl(2) call for illegal cmd value");
716 ATF_TC_BODY(shmctl_illegal_command, tc)
718 /* Create a shared memory segment and obtain the identifier */
720 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
727 /* Destroy the shared memory with ID = shmid */
728 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
731 ATF_TC_CLEANUP(shmctl_illegal_command, tc)
737 ATF_TC_WITH_CLEANUP(semget_success);
738 ATF_TC_HEAD(semget_success, tc)
740 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
744 ATF_TC_BODY(semget_success, tc)
746 FILE *pipefd = setup(fds, auclass);
748 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
755 /* Destroy the semaphore set with ID = semid */
756 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
759 ATF_TC_CLEANUP(semget_success, tc)
765 ATF_TC_WITH_CLEANUP(semget_failure);
766 ATF_TC_HEAD(semget_failure, tc)
768 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
772 ATF_TC_BODY(semget_failure, tc)
775 snprintf(ipcregex, sizeof(ipcregex), "semget.*%d.*return,failure", pid);
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);
783 ATF_TC_CLEANUP(semget_failure, tc)
789 ATF_TC_WITH_CLEANUP(semop_success);
790 ATF_TC_HEAD(semop_success, tc)
792 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
796 ATF_TC_BODY(semop_success, tc)
798 /* Create a semaphore set and obtain the set identifier */
800 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
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);
812 /* Destroy the semaphore set with ID = semid */
813 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
816 ATF_TC_CLEANUP(semop_success, tc)
822 ATF_TC_WITH_CLEANUP(semop_failure);
823 ATF_TC_HEAD(semop_failure, tc)
825 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
829 ATF_TC_BODY(semop_failure, tc)
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);
837 ATF_TC_CLEANUP(semop_failure, tc)
843 ATF_TC_WITH_CLEANUP(semctl_getval_success);
844 ATF_TC_HEAD(semctl_getval_success, tc)
846 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
847 "semctl(2) call for GETVAL command");
850 ATF_TC_BODY(semctl_getval_success, tc)
852 /* Create a semaphore set and obtain the set identifier */
854 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
863 /* Destroy the semaphore set with ID = semid */
864 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
867 ATF_TC_CLEANUP(semctl_getval_success, tc)
873 ATF_TC_WITH_CLEANUP(semctl_getval_failure);
874 ATF_TC_HEAD(semctl_getval_failure, tc)
876 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
877 "semctl(2) call for GETVAL command");
880 ATF_TC_BODY(semctl_getval_failure, tc)
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);
888 ATF_TC_CLEANUP(semctl_getval_failure, tc)
894 ATF_TC_WITH_CLEANUP(semctl_setval_success);
895 ATF_TC_HEAD(semctl_setval_success, tc)
897 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
898 "semctl(2) call for SETVAL command");
901 ATF_TC_BODY(semctl_setval_success, tc)
903 /* Create a semaphore set and obtain the set identifier */
905 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -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);
915 /* Destroy the semaphore set with ID = semid */
916 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
919 ATF_TC_CLEANUP(semctl_setval_success, tc)
925 ATF_TC_WITH_CLEANUP(semctl_setval_failure);
926 ATF_TC_HEAD(semctl_setval_failure, tc)
928 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
929 "semctl(2) call for SETVAL command");
932 ATF_TC_BODY(semctl_setval_failure, tc)
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);
940 ATF_TC_CLEANUP(semctl_setval_failure, tc)
946 ATF_TC_WITH_CLEANUP(semctl_getpid_success);
947 ATF_TC_HEAD(semctl_getpid_success, tc)
949 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
950 "semctl(2) call for GETPID command");
953 ATF_TC_BODY(semctl_getpid_success, tc)
955 /* Create a semaphore set and obtain the set identifier */
957 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
966 /* Destroy the semaphore set with ID = semid */
967 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
970 ATF_TC_CLEANUP(semctl_getpid_success, tc)
976 ATF_TC_WITH_CLEANUP(semctl_getpid_failure);
977 ATF_TC_HEAD(semctl_getpid_failure, tc)
979 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
980 "semctl(2) call for GETPID command");
983 ATF_TC_BODY(semctl_getpid_failure, tc)
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);
991 ATF_TC_CLEANUP(semctl_getpid_failure, tc)
997 ATF_TC_WITH_CLEANUP(semctl_getncnt_success);
998 ATF_TC_HEAD(semctl_getncnt_success, tc)
1000 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1001 "semctl(2) call for GETNCNT command");
1004 ATF_TC_BODY(semctl_getncnt_success, tc)
1006 /* Create a semaphore set and obtain the set identifier */
1007 ATF_REQUIRE((semid =
1008 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
1017 /* Destroy the semaphore set with ID = semid */
1018 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1021 ATF_TC_CLEANUP(semctl_getncnt_success, tc)
1027 ATF_TC_WITH_CLEANUP(semctl_getncnt_failure);
1028 ATF_TC_HEAD(semctl_getncnt_failure, tc)
1030 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1031 "semctl(2) call for GETNCNT command");
1034 ATF_TC_BODY(semctl_getncnt_failure, tc)
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);
1042 ATF_TC_CLEANUP(semctl_getncnt_failure, tc)
1048 ATF_TC_WITH_CLEANUP(semctl_getzcnt_success);
1049 ATF_TC_HEAD(semctl_getzcnt_success, tc)
1051 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1052 "semctl(2) call for GETZCNT command");
1055 ATF_TC_BODY(semctl_getzcnt_success, tc)
1057 /* Create a semaphore set and obtain the set identifier */
1058 ATF_REQUIRE((semid =
1059 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
1068 /* Destroy the semaphore set with ID = semid */
1069 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1072 ATF_TC_CLEANUP(semctl_getzcnt_success, tc)
1078 ATF_TC_WITH_CLEANUP(semctl_getzcnt_failure);
1079 ATF_TC_HEAD(semctl_getzcnt_failure, tc)
1081 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1082 "semctl(2) call for GETZCNT command");
1085 ATF_TC_BODY(semctl_getzcnt_failure, tc)
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);
1093 ATF_TC_CLEANUP(semctl_getzcnt_failure, tc)
1099 ATF_TC_WITH_CLEANUP(semctl_getall_success);
1100 ATF_TC_HEAD(semctl_getall_success, tc)
1102 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1103 "semctl(2) call for GETALL command");
1106 ATF_TC_BODY(semctl_getall_success, tc)
1108 /* Create a semaphore set and obtain the set identifier */
1109 ATF_REQUIRE((semid =
1110 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
1120 /* Destroy the semaphore set with ID = semid */
1121 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1124 ATF_TC_CLEANUP(semctl_getall_success, tc)
1130 ATF_TC_WITH_CLEANUP(semctl_getall_failure);
1131 ATF_TC_HEAD(semctl_getall_failure, tc)
1133 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1134 "semctl(2) call for GETALL command");
1137 ATF_TC_BODY(semctl_getall_failure, tc)
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);
1145 ATF_TC_CLEANUP(semctl_getall_failure, tc)
1151 ATF_TC_WITH_CLEANUP(semctl_setall_success);
1152 ATF_TC_HEAD(semctl_setall_success, tc)
1154 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1155 "semctl(2) call for SETALL command");
1158 ATF_TC_BODY(semctl_setall_success, tc)
1160 /* Create a semaphore set and obtain the set identifier */
1161 ATF_REQUIRE((semid =
1162 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1164 semarg.array = semvals;
1165 /* Initialize semvals to be used with SETALL */
1166 ATF_REQUIRE(semctl(semid, 0, GETALL, semarg) != -1);
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);
1175 /* Destroy the semaphore set with ID = semid */
1176 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1179 ATF_TC_CLEANUP(semctl_setall_success, tc)
1185 ATF_TC_WITH_CLEANUP(semctl_setall_failure);
1186 ATF_TC_HEAD(semctl_setall_failure, tc)
1188 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1189 "semctl(2) call for SETALL command");
1192 ATF_TC_BODY(semctl_setall_failure, tc)
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);
1200 ATF_TC_CLEANUP(semctl_setall_failure, tc)
1206 ATF_TC_WITH_CLEANUP(semctl_stat_success);
1207 ATF_TC_HEAD(semctl_stat_success, tc)
1209 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1210 "semctl(2) call for IPC_STAT command");
1213 ATF_TC_BODY(semctl_stat_success, tc)
1215 /* Create a semaphore set and obtain the set identifier */
1216 ATF_REQUIRE((semid =
1217 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
1227 /* Destroy the semaphore set with ID = semid */
1228 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1231 ATF_TC_CLEANUP(semctl_stat_success, tc)
1237 ATF_TC_WITH_CLEANUP(semctl_stat_failure);
1238 ATF_TC_HEAD(semctl_stat_failure, tc)
1240 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1241 "semctl(2) call for IPC_STAT command");
1244 ATF_TC_BODY(semctl_stat_failure, tc)
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);
1252 ATF_TC_CLEANUP(semctl_stat_failure, tc)
1258 ATF_TC_WITH_CLEANUP(semctl_set_success);
1259 ATF_TC_HEAD(semctl_set_success, tc)
1261 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1262 "semctl(2) call for IPC_SET command");
1265 ATF_TC_BODY(semctl_set_success, tc)
1267 /* Create a semaphore set and obtain the set identifier */
1268 ATF_REQUIRE((semid =
1269 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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));
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);
1282 /* Destroy the semaphore set with ID = semid */
1283 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1286 ATF_TC_CLEANUP(semctl_set_success, tc)
1292 ATF_TC_WITH_CLEANUP(semctl_set_failure);
1293 ATF_TC_HEAD(semctl_set_failure, tc)
1295 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1296 "semctl(2) call for IPC_SET command");
1299 ATF_TC_BODY(semctl_set_failure, tc)
1301 /* Create a semaphore set and obtain the set identifier */
1302 ATF_REQUIRE((semid =
1303 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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));
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);
1314 /* Destroy the semaphore set with ID = semid */
1315 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1318 ATF_TC_CLEANUP(semctl_set_failure, tc)
1324 ATF_TC_WITH_CLEANUP(semctl_rmid_success);
1325 ATF_TC_HEAD(semctl_rmid_success, tc)
1327 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1328 "semctl(2) call for IPC_RMID command");
1331 ATF_TC_BODY(semctl_rmid_success, tc)
1333 /* Create a semaphore set and obtain the set identifier */
1334 ATF_REQUIRE((semid =
1335 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
1345 ATF_TC_CLEANUP(semctl_rmid_success, tc)
1351 ATF_TC_WITH_CLEANUP(semctl_rmid_failure);
1352 ATF_TC_HEAD(semctl_rmid_failure, tc)
1354 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1355 "semctl(2) call for IPC_RMID command");
1358 ATF_TC_BODY(semctl_rmid_failure, tc)
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);
1366 ATF_TC_CLEANUP(semctl_rmid_failure, tc)
1372 ATF_TC_WITH_CLEANUP(semctl_illegal_command);
1373 ATF_TC_HEAD(semctl_illegal_command, tc)
1375 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1376 "semctl(2) call for illegal cmd value");
1379 ATF_TC_BODY(semctl_illegal_command, tc)
1381 /* Create a semaphore set and obtain the set identifier */
1382 ATF_REQUIRE((semid =
1383 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
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);
1390 /* Destroy the semaphore set with ID = semid */
1391 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1394 ATF_TC_CLEANUP(semctl_illegal_command, tc)
1400 ATF_TC_WITH_CLEANUP(shm_open_success);
1401 ATF_TC_HEAD(shm_open_success, tc)
1403 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1404 "shm_open(2) call");
1407 ATF_TC_BODY(shm_open_success, tc)
1410 snprintf(ipcregex, sizeof(ipcregex), "shm_open.*%d.*ret.*success", pid);
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);
1417 ATF_TC_CLEANUP(shm_open_success, tc)
1423 ATF_TC_WITH_CLEANUP(shm_open_failure);
1424 ATF_TC_HEAD(shm_open_failure, tc)
1426 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1427 "shm_open(2) call");
1430 ATF_TC_BODY(shm_open_failure, tc)
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);
1439 ATF_TC_CLEANUP(shm_open_failure, tc)
1445 ATF_TC_WITH_CLEANUP(shm_unlink_success);
1446 ATF_TC_HEAD(shm_unlink_success, tc)
1448 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1449 "shm_unlink(2) call");
1452 ATF_TC_BODY(shm_unlink_success, tc)
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);
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);
1466 ATF_TC_CLEANUP(shm_unlink_success, tc)
1472 ATF_TC_WITH_CLEANUP(shm_unlink_failure);
1473 ATF_TC_HEAD(shm_unlink_failure, tc)
1475 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1476 "shm_unlink(2) call");
1479 ATF_TC_BODY(shm_unlink_failure, tc)
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);
1487 ATF_TC_CLEANUP(shm_unlink_failure, tc)
1493 ATF_TC_WITH_CLEANUP(pipe_success);
1494 ATF_TC_HEAD(pipe_success, tc)
1496 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1500 ATF_TC_BODY(pipe_success, tc)
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);
1513 ATF_TC_CLEANUP(pipe_success, tc)
1519 ATF_TC_WITH_CLEANUP(pipe_failure);
1520 ATF_TC_HEAD(pipe_failure, tc)
1522 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1526 ATF_TC_BODY(pipe_failure, tc)
1529 snprintf(ipcregex, sizeof(ipcregex), "pipe.*%d.*return.failure", pid);
1531 FILE *pipefd = setup(fds, auclass);
1532 ATF_REQUIRE_EQ(-1, pipe(NULL));
1533 check_audit(fds, ipcregex, pipefd);
1536 ATF_TC_CLEANUP(pipe_failure, tc)
1542 ATF_TC_WITH_CLEANUP(posix_openpt_success);
1543 ATF_TC_HEAD(posix_openpt_success, tc)
1545 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1546 "posix_openpt(2) call");
1549 ATF_TC_BODY(posix_openpt_success, tc)
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);
1561 ATF_TC_CLEANUP(posix_openpt_success, tc)
1567 ATF_TC_WITH_CLEANUP(posix_openpt_failure);
1568 ATF_TC_HEAD(posix_openpt_failure, tc)
1570 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1571 "posix_openpt(2) call");
1574 ATF_TC_BODY(posix_openpt_failure, tc)
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);
1582 ATF_TC_CLEANUP(posix_openpt_failure, tc)
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);
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);
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);
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);
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);
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);
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);
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);
1657 return (atf_no_error());