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 ------------------------------------------------------------------------------ _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel