aboutsummaryrefslogtreecommitdiff
path: root/tests-mx32/ipc_shm.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests-mx32/ipc_shm.c')
-rw-r--r--tests-mx32/ipc_shm.c59
1 files changed, 52 insertions, 7 deletions
diff --git a/tests-mx32/ipc_shm.c b/tests-mx32/ipc_shm.c
index 66960ff9..c7931388 100644
--- a/tests-mx32/ipc_shm.c
+++ b/tests-mx32/ipc_shm.c
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2015 Elvira Khabirova <lineprinter0@gmail.com>
* Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2015-2017 The strace developers.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,6 +33,14 @@
#include <stdlib.h>
#include <sys/shm.h>
+#ifndef SHM_HUGE_SHIFT
+# define SHM_HUGE_SHIFT 26
+#endif
+
+#ifndef SHM_HUGE_MASK
+# define SHM_HUGE_MASK 0x3f
+#endif
+
#include "xlat.h"
#include "xlat/shm_resource_flags.h"
@@ -64,18 +73,54 @@ main(void)
#else
(size_t) 0x1e55c0de5dec0dedULL;
#endif
- static const int bogus_flags = 0xface1e55;
-
+ static const unsigned int bogus_ipc_shm_flags =
+ IPC_CREAT | IPC_EXCL | SHM_HUGETLB | SHM_NORESERVE;
+ static const unsigned int huge_mask = SHM_HUGE_MASK << SHM_HUGE_SHIFT;
+ static const unsigned int huge_flags = 21 << SHM_HUGE_SHIFT;
+ int bogus_flags;
int rc;
struct shmid_ds ds;
+ rc = shmget(bogus_key, bogus_size, 0);
+ printf("shmget\\(%#llx, %zu, 000\\) += %s\n",
+ zero_extend_signed_to_ull(bogus_key), bogus_size,
+ sprintrc_grep(rc));
+
+ rc = shmget(bogus_key, bogus_size, huge_flags);
+ printf("shmget\\(%#llx, %zu, %s\\|%#03o\\) += %s\n",
+ zero_extend_signed_to_ull(bogus_key), bogus_size,
+ "21<<SHM_HUGE_SHIFT", 0, sprintrc_grep(rc));
+
+ bogus_flags = 0xface1e55 & ~(bogus_ipc_shm_flags | huge_mask);
+ rc = shmget(bogus_key, bogus_size, bogus_flags);
+ printf("shmget\\(%#llx, %zu, %#x\\|%#03o\\) += %s\n",
+ zero_extend_signed_to_ull(bogus_key), bogus_size,
+ bogus_flags & ~0777,
+ bogus_flags & 0777, sprintrc_grep(rc));
+
+ bogus_flags |= bogus_ipc_shm_flags;
+ rc = shmget(bogus_key, bogus_size, bogus_flags);
+ printf("shmget\\(%#llx, %zu, %s\\|%#x\\|%#03o\\) += %s\n",
+ zero_extend_signed_to_ull(bogus_key), bogus_size,
+ "IPC_CREAT\\|IPC_EXCL\\|SHM_HUGETLB\\|SHM_NORESERVE",
+ bogus_flags & ~(0777 | bogus_ipc_shm_flags),
+ bogus_flags & 0777, sprintrc_grep(rc));
+
+ bogus_flags |= huge_flags;
+ rc = shmget(bogus_key, bogus_size, bogus_flags);
+ printf("shmget\\(%#llx, %zu, %s\\|%#x\\|%s\\|%#03o\\) += %s\n",
+ zero_extend_signed_to_ull(bogus_key), bogus_size,
+ "IPC_CREAT\\|IPC_EXCL\\|SHM_HUGETLB\\|SHM_NORESERVE",
+ bogus_flags & ~(0777 | bogus_ipc_shm_flags | huge_mask),
+ "21<<SHM_HUGE_SHIFT",
+ bogus_flags & 0777, sprintrc_grep(rc));
+
+ bogus_flags &= ~bogus_ipc_shm_flags;
rc = shmget(bogus_key, bogus_size, bogus_flags);
- printf("shmget\\(%#llx, %zu, %s%s%s%#x\\|%#04o\\) += %s\n",
+ printf("shmget\\(%#llx, %zu, %#x\\|%s\\|%#03o\\) += %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),
+ bogus_flags & ~(0777 | huge_mask),
+ "21<<SHM_HUGE_SHIFT",
bogus_flags & 0777, sprintrc_grep(rc));
id = shmget(private_key, 1, 0600);