[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