struct shmid_ds ds;
rc = shmget(bogus_key, bogus_size, bogus_flags);
- printf("shmget\\(%#llx, %zu, %s%s%s%#x\\|%#04o\\) += %s\n",
+ printf("shmget\\(%#llx, %zu, %s%s%s%s%#x\\|%#04o\\) += %s\n",
zero_extend_signed_to_ull(bogus_key), bogus_size,
IPC_CREAT & bogus_flags ? "IPC_CREAT\\|" : "",
IPC_EXCL & bogus_flags ? "IPC_EXCL\\|" : "",
SHM_HUGETLB & bogus_flags ? "SHM_HUGETLB\\|" : "",
- bogus_flags & ~(0777 | IPC_CREAT | IPC_EXCL | SHM_HUGETLB),
+ SHM_NORESERVE & bogus_flags ? "SHM_NORESERVE\\|" : "",
+ bogus_flags & ~(0777 | IPC_CREAT | IPC_EXCL
+ | SHM_HUGETLB | SHM_NORESERVE),
bogus_flags & 0777, sprintrc_grep(rc));
id = shmget(private_key, 1, 0600);
atexit(cleanup);
rc = (long) shmat(bogus_shmid, bogus_shmaddr, bogus_shmflg);
- printf("%s(%d, %p, SHM_REMAP|SHM_RDONLY|SHM_RND|%#x) = %s\n",
- SHMAT, bogus_shmid, bogus_shmaddr, bogus_shmflg & ~0x7000,
+ printf("%s(%d, %p, SHM_RDONLY|SHM_RND|SHM_REMAP|SHM_EXEC|%#x) = %s\n",
+ SHMAT, bogus_shmid, bogus_shmaddr, bogus_shmflg & ~0xf000,
sprintrc(rc));
shmat(id, NULL, SHM_REMAP);
rc = shmdt(NULL);
printf("shmdt(NULL) = %s\n", sprintrc(rc));
- if (shmdt(shmaddr))
- perror_msg_and_skip("shmdt");
- printf("shmdt(%p) = 0\n", shmaddr);
+ rc = shmdt(shmaddr);
+ printf("shmdt(%p) = %s\n", shmaddr, sprintrc(rc));
++shmaddr;
void *shmaddr2 = shmat(id, shmaddr, SHM_RND);
if (shmaddr2 == (void *)(-1))
printf("%s(%d, %p, SHM_RND) = -1 %s (%m)\n",
SHMAT, id, shmaddr, errno2name());
- else
+ else {
printf("%s(%d, %p, SHM_RND) = %p\n",
SHMAT, id, shmaddr, shmaddr2);
+ rc = shmdt(shmaddr2);
+ printf("shmdt(%p) = %s\n", shmaddr2, sprintrc(rc));
+ }
+
+ shmaddr = shmat(id, NULL, SHM_RDONLY|SHM_EXEC);
+ if (shmaddr == (void *)(-1))
+ printf("%s(%d, NULL, SHM_RDONLY|SHM_EXEC) = %s\n",
+ SHMAT, id, sprintrc(-1));
+ else {
+ printf("%s(%d, NULL, SHM_RDONLY|SHM_EXEC) = %p\n",
+ SHMAT, id, shmaddr);
+ rc = shmdt(shmaddr);
+ printf("shmdt(%p) = %s\n", shmaddr, sprintrc(rc));
+ }
puts("+++ exited with 0 +++");
return 0;