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.
7 * SPDX-License-Identifier: GPL-2.0-or-later
16 #ifndef SHM_HUGE_SHIFT
17 # define SHM_HUGE_SHIFT 26
21 # define SHM_HUGE_MASK 0x3f
25 # define SHM_STAT_ANY 15
29 #include "xlat/shm_resource_flags.h"
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"
44 # define str_ipc_flags \
45 "0x2ce1e00 /\\* IPC_CREAT\\|IPC_EXCL\\|SHM_HUGETLB\\|SHM_NORESERVE" \
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_\\?\\?\\? \\*/"
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_\\?\\?\\? \\*/"
77 shmctl(id, IPC_RMID, NULL);
78 printf("shmctl\\(%d, (%s\\|)?%s, NULL\\) = 0\n",
79 id, str_ipc_64, str_ipc_rmid);
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 =
94 * musl sets size to SIZE_MAX if size argument is greater than
95 * PTRDIFF_MAX - musl/src/ipc/shmget.c
98 (size_t) 0xdec0ded1dec0ded2ULL;
100 (size_t) 0x1e55c0de5dec0dedULL;
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;
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,
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));
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,
125 bogus_flags & 0777, sprintrc_grep(rc));
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,
132 bogus_flags & 0777, sprintrc_grep(rc));
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));
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),
147 bogus_flags & 0777, sprintrc_grep(rc));
149 id = shmget(private_key, 1, 0600);
151 perror_msg_and_skip("shmget");
152 printf("shmget\\(%s, 1, 0600\\) = %d\n", str_ipc_private, id);
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));
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,
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);
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);
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));
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));
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));