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