1 /*
2 * This file is part of caps strace test.
3 *
4 * Copyright (c) 2014-2021 Dmitry V. Levin <ldv@strace.io>
5 * All rights reserved.
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10 #include "tests.h"
11 #include <errno.h>
12 #include <string.h>
13
14 extern int capget(int *, int *);
15 extern int capset(int *, const int *);
16
17 int
18 main(void)
19 {
20 const int data[] = { 2, 4, 0, 8, 16, 0 };
21 const int v1 = 0x19980330;
22 const int v2 = 0x20071026;
23 const int v3 = 0x20080522;
24
25 int * const head = tail_alloc(sizeof(int) * 2);
26 head[0] = v3;
27 head[1] = 0;
28 int * const tail_data = tail_alloc(sizeof(data));
29
30 capget(NULL, NULL);
31 capget(head + 2, tail_data);
32 capget(head, tail_data + ARRAY_SIZE(data));
33
34 if (capget(head, tail_data))
35 perror_msg_and_skip("capget");
36 if (head[0] != v3)
37 error_msg_and_skip("capget: v3 expected");
38
39 memcpy(tail_data, data, sizeof(data));
40
41 capset(NULL, NULL);
42 capset(head + 2, tail_data);
43
44 head[0] = 0xbadc0ded;
45 head[1] = 2718281828U;
46 capset(head, tail_data + ARRAY_SIZE(data) - 2);
47
48 head[0] = v2;
49 head[1] = 0;
50 capset(head, tail_data + ARRAY_SIZE(data) - 5);
51
52 memcpy(tail_data, data, sizeof(data));
53 head[0] = v3;
54 if (capset(head, tail_data) == 0 || errno != EPERM)
55 perror_msg_and_skip("capset");
56
57 memset(tail_data, 0, sizeof(data) / 2);
58 if (capset(head, tail_data) == 0 || errno != EPERM)
59 perror_msg_and_skip("capset");
60
61 memcpy(tail_data + ARRAY_SIZE(data) / 2, data, sizeof(data) / 2);
62 head[0] = v1;
63 if (capset(head, tail_data + ARRAY_SIZE(data) / 2) == 0 ||
64 errno != EPERM)
65 perror_msg_and_skip("capset");
66
67 return 0;
68 }