S390: Fix struct sigaction for 31bit in kernel_sigaction.h.
authorStefan Liebler <stli@linux.vnet.ibm.com>
Thu, 12 Apr 2018 07:37:26 +0000 (09:37 +0200)
committerStefan Liebler <stli@linux.vnet.ibm.com>
Thu, 12 Apr 2018 07:37:26 +0000 (09:37 +0200)
The recent commit b4a5d26d8835d972995f0a0a2f805a8845bafa0b
"linux: Consolidate sigaction implementation" changed the definition
of struct sigaction for s390 (31bit). Unfortunately the order of the
fields were wrong.

This leads to blocking testcases e.g. nptl/tst-sem11.
A thread which blocks due to sem_wait() is cancelled via pthread_cancel()
and the signal-handler sigcancel_handler (see <glibc-src>/nptl/nptl-init.c
is called.
But it just returns as the siginfo_t argument is not setup by the kernel.
Then the main-thread is blocking due to pthread_join().

The flag SA_SIGINFO is set in sa_flags in struct sigaction and
is copied to the "kernel_sigaction.h" struct by the sigaction() call,
but due to the wrong ordering of the struct fields,
the kernel does not recognize it.

ChangeLog
sysdeps/unix/sysv/linux/s390/kernel_sigaction.h

index 2b15609..dac4fff 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-04-12  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
+       * sysdeps/unix/sysv/linux/s390/kernel_sigaction.h
+       (struct kernel_sigaction): Use the same definition on 31bit as is used
+       on 64bit.
+
 2018-04-09  Florian Weimer  <fweimer@redhat.com>
 
        [BZ #23037]
index a8beaf7..7a6a2c4 100644 (file)
@@ -11,15 +11,19 @@ struct kernel_sigaction
     void (*_sa_sigaction)(int, siginfo_t *, void *);
   } _u;
 #define k_sa_handler _u._sa_handler
-#ifndef __s390x__
-  sigset_t sa_mask;
-  unsigned long sa_flags;
-  void (*sa_restorer)(void);
-#else
+  /* The 'struct sigaction' definition in s390 kernel header
+     arch/s390/include/uapi/asm/signal.h is used for __NR_rt_sigaction
+     on 64 bits and for __NR_sigaction for 31 bits.
+
+     The expected layout for __NR_rt_sigaction for 31 bits is either
+     'struct sigaction' from include/linux/signal_types.h or
+     'struct compat_sigaction' from include/linux/compat.h.
+
+     So for __NR_rt_sigaction we can use the same layout for both s390x
+     and s390.  */
   unsigned long sa_flags;
   void (*sa_restorer)(void);
   sigset_t sa_mask;
-#endif
 };
 
 #define SET_SA_RESTORER(kact, act)             \