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