1 /*
2 * Test that shmat() does not break /proc/self/maps.
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 #include <assert.h>
7 #include <fcntl.h>
8 #include <stdlib.h>
9 #include <sys/ipc.h>
10 #include <sys/shm.h>
11 #include <unistd.h>
12
main(void)13 int main(void)
14 {
15 char buf[128];
16 int err, fd;
17 int shmid;
18 ssize_t n;
19 void *p;
20
21 shmid = shmget(IPC_PRIVATE, 1, IPC_CREAT | 0600);
22 assert(shmid != -1);
23
24 /*
25 * The original bug required a non-NULL address, which skipped the
26 * mmap_find_vma step, which could result in a host mapping smaller
27 * than the target mapping. Choose an address at random.
28 */
29 p = shmat(shmid, (void *)0x800000, SHM_RND);
30 if (p == (void *)-1) {
31 /*
32 * Because we are now running the testcase for all guests for which
33 * we have a cross-compiler, the above random address might conflict
34 * with the guest executable in some way. Rather than stopping,
35 * continue with a system supplied address, which should never fail.
36 */
37 p = shmat(shmid, NULL, 0);
38 assert(p != (void *)-1);
39 }
40
41 fd = open("/proc/self/maps", O_RDONLY);
42 assert(fd != -1);
43 do {
44 n = read(fd, buf, sizeof(buf));
45 assert(n >= 0);
46 } while (n != 0);
47 close(fd);
48
49 err = shmdt(p);
50 assert(err == 0);
51 err = shmctl(shmid, IPC_RMID, NULL);
52 assert(err == 0);
53
54 return EXIT_SUCCESS;
55 }
56