]> granicus.if.org Git - strace/blob - tests/ipc_shm.c
Remove XLAT_END
[strace] / tests / ipc_shm.c
1 /*
2  * Copyright (c) 2015 Elvira Khabirova <lineprinter0@gmail.com>
3  * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
4  * Copyright (c) 2015-2018 The strace developers.
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 <stdio.h>
13 #include <stdlib.h>
14 #include <sys/shm.h>
15
16 #ifndef SHM_HUGE_SHIFT
17 # define SHM_HUGE_SHIFT 26
18 #endif
19
20 #ifndef SHM_HUGE_MASK
21 # define SHM_HUGE_MASK 0x3f
22 #endif
23
24 #ifndef SHM_STAT_ANY
25 # define SHM_STAT_ANY 15
26 #endif
27
28 #include "xlat.h"
29 #include "xlat/shm_resource_flags.h"
30
31 #if XLAT_RAW
32 # define str_ipc_flags "0x2ce1e00"
33 # define str_shm_huge "21<<26"
34 # define str_ipc_private "0"
35 # define str_ipc_rmid "0"
36 # define str_ipc_set "0x1"
37 # define str_ipc_stat "0x2"
38 # define str_shm_stat "0xd"
39 # define str_shm_info "0xe"
40 # define str_shm_stat_any "0xf"
41 # define str_ipc_64 "0x100"
42 # define str_bogus_cmd "0xdefaced2"
43 #elif XLAT_VERBOSE
44 # define str_ipc_flags \
45         "0x2ce1e00 /\\* IPC_CREAT\\|IPC_EXCL\\|SHM_HUGETLB\\|SHM_NORESERVE" \
46         "\\|0x2ce0000 \\*/"
47 # define str_shm_huge "21<<26 /\\* SHM_HUGE_SHIFT \\*/"
48 # define str_ipc_private "0 /\\* IPC_PRIVATE \\*/"
49 # define str_ipc_rmid "0 /\\* IPC_RMID \\*/"
50 # define str_ipc_set "0x1 /\\* IPC_SET \\*/"
51 # define str_ipc_stat "0x2 /\\* IPC_STAT \\*/"
52 # define str_shm_stat "0xd /\\* SHM_STAT \\*/"
53 # define str_shm_info "0xe /\\* SHM_INFO \\*/"
54 # define str_shm_stat_any "0xf /\\* SHM_STAT_ANY \\*/"
55 # define str_ipc_64 "0x100 /\\* IPC_64 \\*/"
56 # define str_bogus_cmd "0xdefaced2 /\\* SHM_\\?\\?\\? \\*/"
57 #else
58 # define str_ipc_flags \
59         "IPC_CREAT\\|IPC_EXCL\\|SHM_HUGETLB\\|SHM_NORESERVE\\|0x2ce0000"
60 # define str_shm_huge "21<<SHM_HUGE_SHIFT"
61 # define str_ipc_private "IPC_PRIVATE"
62 # define str_ipc_rmid "IPC_RMID"
63 # define str_ipc_set "IPC_SET"
64 # define str_ipc_stat "IPC_STAT"
65 # define str_shm_stat "SHM_STAT"
66 # define str_shm_info "SHM_INFO"
67 # define str_shm_stat_any "SHM_STAT_ANY"
68 # define str_ipc_64 "IPC_64"
69 # define str_bogus_cmd "0xdefaced2 /\\* SHM_\\?\\?\\? \\*/"
70 #endif
71
72 static int id = -1;
73
74 static void
75 cleanup(void)
76 {
77         shmctl(id, IPC_RMID, NULL);
78         printf("shmctl\\(%d, (%s\\|)?%s, NULL\\) = 0\n",
79                id, str_ipc_64, str_ipc_rmid);
80         id = -1;
81 }
82
83 int
84 main(void)
85 {
86         static const key_t private_key =
87                 (key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
88         static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
89         static const int bogus_id = 0xdefaced1;
90         static const int bogus_cmd = 0xdefaced2;
91         static void * const bogus_addr = (void *) -1L;
92         static const size_t bogus_size =
93         /*
94          * musl sets size to SIZE_MAX if size argument is greater than
95          * PTRDIFF_MAX - musl/src/ipc/shmget.c
96          */
97 #ifdef __GLIBC__
98                 (size_t) 0xdec0ded1dec0ded2ULL;
99 #else
100                 (size_t) 0x1e55c0de5dec0dedULL;
101 #endif
102         static const unsigned int bogus_ipc_shm_flags =
103                 IPC_CREAT | IPC_EXCL | SHM_HUGETLB | SHM_NORESERVE;
104         static const unsigned int huge_mask = SHM_HUGE_MASK << SHM_HUGE_SHIFT;
105         static const unsigned int huge_flags = 21 << SHM_HUGE_SHIFT;
106         int bogus_flags;
107         int rc;
108         struct shmid_ds ds;
109
110         rc = shmget(bogus_key, bogus_size, 0);
111         printf("shmget\\(%#llx, %zu, 000\\) = %s\n",
112                zero_extend_signed_to_ull(bogus_key), bogus_size,
113                sprintrc_grep(rc));
114
115         rc = shmget(bogus_key, bogus_size, huge_flags);
116         printf("shmget\\(%#llx, %zu, %s\\|%#03o\\) = %s\n",
117                zero_extend_signed_to_ull(bogus_key), bogus_size,
118                str_shm_huge, 0, sprintrc_grep(rc));
119
120         bogus_flags = 0xface1e55 & ~(bogus_ipc_shm_flags | huge_mask);
121         rc = shmget(bogus_key, bogus_size, bogus_flags);
122         printf("shmget\\(%#llx, %zu, %#x\\|%#03o\\) = %s\n",
123                zero_extend_signed_to_ull(bogus_key), bogus_size,
124                bogus_flags & ~0777,
125                bogus_flags & 0777, sprintrc_grep(rc));
126
127         bogus_flags |= bogus_ipc_shm_flags;
128         rc = shmget(bogus_key, bogus_size, bogus_flags);
129         printf("shmget\\(%#llx, %zu, %s\\|%#03o\\) = %s\n",
130                zero_extend_signed_to_ull(bogus_key), bogus_size,
131                str_ipc_flags,
132                bogus_flags & 0777, sprintrc_grep(rc));
133
134         bogus_flags |= huge_flags;
135         rc = shmget(bogus_key, bogus_size, bogus_flags);
136         printf("shmget\\(%#llx, %zu, %s\\|%s\\|%#03o\\) = %s\n",
137                zero_extend_signed_to_ull(bogus_key), bogus_size,
138                str_ipc_flags, str_shm_huge,
139                bogus_flags & 0777, sprintrc_grep(rc));
140
141         bogus_flags &= ~bogus_ipc_shm_flags;
142         rc = shmget(bogus_key, bogus_size, bogus_flags);
143         printf("shmget\\(%#llx, %zu, %#x\\|%s\\|%#03o\\) = %s\n",
144                zero_extend_signed_to_ull(bogus_key), bogus_size,
145                bogus_flags & ~(0777 | huge_mask),
146                str_shm_huge,
147                bogus_flags & 0777, sprintrc_grep(rc));
148
149         id = shmget(private_key, 1, 0600);
150         if (id < 0)
151                 perror_msg_and_skip("shmget");
152         printf("shmget\\(%s, 1, 0600\\) = %d\n", str_ipc_private, id);
153         atexit(cleanup);
154
155         rc = shmctl(bogus_id, bogus_cmd, NULL);
156         printf("shmctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
157                bogus_id, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
158
159         rc = shmctl(bogus_id, IPC_STAT, bogus_addr);
160         printf("shmctl\\(%d, (%s\\|)?%s, %p\\) = %s\n",
161                bogus_id, str_ipc_64, str_ipc_stat, bogus_addr,
162                sprintrc_grep(rc));
163
164         if (shmctl(id, IPC_STAT, &ds))
165                 perror_msg_and_skip("shmctl IPC_STAT");
166         printf("shmctl\\(%d, (%s\\|)?%s, \\{shm_perm=\\{uid=%u, gid=%u, "
167                 "mode=%#o, key=%u, cuid=%u, cgid=%u\\}, shm_segsz=%u, shm_cpid=%u, "
168                 "shm_lpid=%u, shm_nattch=%u, shm_atime=%u, shm_dtime=%u, "
169                 "shm_ctime=%u\\}\\) = 0\n",
170                 id, str_ipc_64, str_ipc_stat,
171                 (unsigned) ds.shm_perm.uid, (unsigned) ds.shm_perm.gid,
172                 (unsigned) ds.shm_perm.mode, (unsigned) ds.shm_perm.__key,
173                 (unsigned) ds.shm_perm.cuid, (unsigned) ds.shm_perm.cgid,
174                 (unsigned) ds.shm_segsz, (unsigned) ds.shm_cpid,
175                 (unsigned) ds.shm_lpid, (unsigned) ds.shm_nattch,
176                 (unsigned) ds.shm_atime, (unsigned) ds.shm_dtime,
177                 (unsigned) ds. shm_ctime);
178
179         if (shmctl(id, IPC_SET, &ds))
180                 perror_msg_and_skip("shmctl IPC_SET");
181         printf("shmctl\\(%d, (%s\\|)?%s, \\{shm_perm=\\{uid=%u, gid=%u"
182                ", mode=%#o\\}, ...\\}\\) = 0\n",
183                id, str_ipc_64, str_ipc_set,
184                (unsigned) ds.shm_perm.uid, (unsigned) ds.shm_perm.gid,
185                (unsigned) ds.shm_perm.mode);
186
187         rc = shmctl(0, SHM_INFO, &ds);
188         printf("shmctl\\(0, (%s\\|)?%s, %p\\) = %s\n",
189                str_ipc_64, str_shm_info, &ds, sprintrc_grep(rc));
190
191         rc = shmctl(id, SHM_STAT, &ds);
192         printf("shmctl\\(%d, (%s\\|)?%s, %p\\) = %s\n",
193                id, str_ipc_64, str_shm_stat, &ds, sprintrc_grep(rc));
194
195         rc = shmctl(id, SHM_STAT_ANY, &ds);
196         printf("shmctl\\(%d, (%s\\|)?%s, %p\\) = %s\n",
197                id, str_ipc_64, str_shm_stat_any, &ds, sprintrc_grep(rc));
198
199         return 0;
200 }