[PATCH v3 2/2] tests: Workaroud for buggy glibc in ipc_msg test on ppc64
Eugene Syromyatnikov
evgsyr at gmail.com
Mon Sep 12 23:56:44 UTC 2016
glibc before 2.23 (glibc-2.22-122-gbe48165? to be more precise) tried to access
data pointed by third argument of msgctl call on 64-bit PowerPC which led to
segmentataion fault (instead of EFAULT from kernel).
* tests/ipc_msg.c (BROKEN_GLIBC): new macro.
(main): test for incorrect third argument decoding only in case glibc is
not buggy.
---
tests/ipc_msg.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/tests/ipc_msg.c b/tests/ipc_msg.c
index af0c377..d5d2050 100644
--- a/tests/ipc_msg.c
+++ b/tests/ipc_msg.c
@@ -37,6 +37,24 @@
#include "xlat.h"
#include "xlat/resource_flags.h"
+/*
+ * Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data provided in
+ * third argument of msgctl call (in case of IPC_SET cmd) which led to
+ * segmentation fault.
+ */
+#if !(defined BROKEN_GLIBC)
+# if defined __GLIBC__ && defined POWERPC && defined POWERPC64
+# if !(defined __GLIBC_MINOR__) || \
+ ((__GLIBC__ << 16) + __GLIBC_MINOR__ < (2 << 16) + 23)
+# define BROKEN_GLIBC 1
+# endif
+# endif /* __GLIBC__ && _powerpc__ && __ppc64__ */
+#endif /* !BROKEN_GLIBC */
+
+#ifndef BROKEN_GLIBC
+# define BROKEN_GLIBC 0
+#endif
+
static int id = -1;
static void
@@ -58,7 +76,9 @@ main(void)
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
static const int bogus_msgid = 0xfdb97531;
static const int bogus_cmd = 0xdeadbeef;
+#if !BROKEN_GLIBC
static void * const bogus_addr = (void *) -1L;
+#endif
static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
assert(msgget(bogus_key, bogus_flags) == -1);
@@ -81,9 +101,11 @@ main(void)
printf("msgctl\\(%d, (IPC_64\\|)?%#x /\\* MSG_\\?\\?\\? \\*/, NULL\\) "
"+= %s\n", bogus_msgid, bogus_cmd, sprintrc_grep(-1));
+#if !BROKEN_GLIBC
assert(msgctl(bogus_msgid, IPC_SET, bogus_addr) == -1);
printf("msgctl\\(%d, (IPC_64\\|)?IPC_SET, %p\\) += %s\n",
bogus_msgid, bogus_addr, sprintrc_grep(-1));
+#endif
if (msgctl(id, IPC_STAT, &ds))
perror_msg_and_skip("msgctl IPC_STAT");
--
1.7.10.4
More information about the Strace-devel
mailing list