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