]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
m68k: Fix sigaction kernel definition (BZ #23967)
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 11 Dec 2018 18:52:47 +0000 (16:52 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 19 Dec 2018 10:52:43 +0000 (08:52 -0200)
Commit b4a5d26d883 (linux: Consolidate sigaction implementation) added
a wrong kernel_sigaction definition for m68k, meant for __NR_sigaction
instead of __NR_rt_sigaction as used on generic Linux sigaction
implementation.  This patch fixes it by using the Linux generic
definition meant for the RT kernel ABI.

Checked the signal tests on emulated m68-linux-gnu (Aranym).  It fixes
the faulty signal/tst-sigaction and man works as expected.

Adhemerval Zanella  <adhemerval.zanella@linaro.org>
James Clarke  <jrtc27@jrtc27.com>

[BZ #23967]
* sysdeps/unix/sysv/linux/kernel_sigaction.h (HAS_SA_RESTORER):
Define if SA_RESTORER is defined.
(kernel_sigaction): Define sa_restorer if HAS_SA_RESTORER is defined.
(SET_SA_RESTORER, RESET_SA_RESTORER): Define iff the macro are not
already defined.
* sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h (SA_RESTORER,
kernel_sigaction, SET_SA_RESTORER, RESET_SA_RESTORER): Remove
definitions.
(HAS_SA_RESTORER): Define.
* sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h (SA_RESTORER,
SET_SA_RESTORER, RESET_SA_RESTORER): Remove definition.
(HAS_SA_RESTORER): Define.
* sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h: Include generic
kernel_sigaction after define SET_SA_RESTORER and RESET_SA_RESTORER.
* sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h: Likewise.
* sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise.

(cherry picked from commit 43a45c2d829f164c1fb94d5f44afe326fae946e1)

ChangeLog
sysdeps/unix/sysv/linux/kernel_sigaction.h
sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h
sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h
sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h
sysdeps/unix/sysv/linux/sh/kernel_sigaction.h
sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
sysdeps/unix/sysv/linux/x86_64/sigaction.c

index 81555f1675a7bcb00e697d0eb6626731a4d6fec1..739fe56d7328ee292c2fd4a3639991871b555085 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2018-12-18  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+           James Clarke  <jrtc27@jrtc27.com>
+
+       [BZ #23967]
+       * sysdeps/unix/sysv/linux/kernel_sigaction.h (HAS_SA_RESTORER):
+       Define if SA_RESTORER is defined.
+       (kernel_sigaction): Define sa_restorer if HAS_SA_RESTORER is defined.
+       (SET_SA_RESTORER, RESET_SA_RESTORER): Define iff the macro are not
+       already defined.
+       * sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h (SA_RESTORER,
+       kernel_sigaction, SET_SA_RESTORER, RESET_SA_RESTORER): Remove
+       definitions.
+       (HAS_SA_RESTORER): Define.
+       * sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h (SA_RESTORER,
+       SET_SA_RESTORER, RESET_SA_RESTORER): Remove definition.
+       (HAS_SA_RESTORER): Define.
+       * sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h: Include generic
+       kernel_sigaction after define SET_SA_RESTORER and RESET_SA_RESTORER.
+       * sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h: Likewise.
+       * sysdeps/unix/sysv/linux/s390/kernel_sigaction.h: Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise.
+
 2018-10-30  Andreas Schwab  <schwab@suse.de>
 
        [BZ #23125]
index 2dbec08099345c74b37acc93547af1e142a45815..1c36146d4616b902bc0acac1180e7b624194bb3c 100644 (file)
@@ -1,19 +1,27 @@
 #ifndef _KERNEL_SIGACTION_H
 # define _KERNEL_SIGACTION_H
 
+#ifdef SA_RESTORER
+# define HAS_SA_RESTORER 1
+#endif
+
 /* This is the sigaction structure from the Linux 3.2 kernel.  */
 struct kernel_sigaction
 {
   __sighandler_t k_sa_handler;
   unsigned long sa_flags;
-#ifdef SA_RESTORER
+#ifdef HAS_SA_RESTORER
   void (*sa_restorer) (void);
 #endif
+  /* glibc sigset is larger than kernel expected one, however sigaction
+     passes the kernel expected size on rt_sigaction syscall.  */
   sigset_t sa_mask;
 };
 
-#ifndef SA_RESTORER
+#ifndef SET_SA_RESTORER
 # define SET_SA_RESTORER(kact, act)
+#endif
+#ifndef RESET_SA_RESTORER
 # define RESET_SA_RESTORER(act, kact)
 #endif
 
index 54972feb13bf0b14d35eedaf0b1c38e9dd8867ba..464b351d6d86563f4d15a0a5e273ed27f27e2660 100644 (file)
@@ -1,22 +1,4 @@
-#ifndef _KERNEL_SIGACTION_H
-# define _KERNEL_SIGACTION_H
-
-#include <signal.h>
-
-#define SA_RESTORER 0x04000000
-
-/* This is the sigaction structure from the Linux 3.2 kernel.  */
-struct kernel_sigaction
-{
-  __sighandler_t k_sa_handler;
-  sigset_t sa_mask;
-  unsigned long sa_flags;
-  void (*sa_restorer) (void);
-};
-
-#define SET_SA_RESTORER(kact, act)                     \
-  (kact)->sa_restorer = (act)->sa_restorer
-#define RESET_SA_RESTORER(act, kact)                   \
-  (act)->sa_restorer = (kact)->sa_restorer
-
-#endif
+/* m68k does not define SA_RESTORER, but does have sa_restorer member
+   on kernel sigaction struct.  */
+#define HAS_SA_RESTORER 1
+#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
index 4ada32210407a4a1046f981ae11df957dbb20849..89f9bcedfd30e356df9c0840a0d9e37d865d45de 100644 (file)
@@ -1,8 +1,9 @@
 /* NIOS2 uses the generic Linux UAPI but defines SA_RESTORER.  */
 #define SA_RESTORER 0x04000000
-#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
 
 #define SET_SA_RESTORER(kact, act)             \
   (kact)->sa_restorer = (act)->sa_restorer
 #define RESET_SA_RESTORER(act, kact)           \
   (act)->sa_restorer = (kact)->sa_restorer
+
+#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
index aef3d5a3b3c73844c7037800de1529c3e773c9b5..bac03ee45d19f5a129348e65b4a9b82bfba922fc 100644 (file)
@@ -1,9 +1,10 @@
 /* powerpc kernel sigaction is similar to generic Linux UAPI one,
    but the architecture also defines SA_RESTORER.  */
 #define SA_RESTORER 0x04000000
-#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
 
 #define SET_SA_RESTORER(kact, act)             \
   (kact)->sa_restorer = (act)->sa_restorer
 #define RESET_SA_RESTORER(act, kact)           \
   (act)->sa_restorer = (kact)->sa_restorer
+
+#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
index 7ebcd08d629c1598806658d5168c756c62880a67..c8dc77a02bd8d182bafbddf06fc8ebee6288233b 100644 (file)
@@ -1,8 +1,9 @@
 /* SH uses the generic Linux UAPI but defines SA_RESTORER.  */
 #define SA_RESTORER 0x04000000
-#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
 
 #define SET_SA_RESTORER(kact, act)             \
   (kact)->sa_restorer = (act)->sa_restorer
 #define RESET_SA_RESTORER(act, kact)           \
   (act)->sa_restorer = (kact)->sa_restorer
+
+#include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
index bee7e9cd03e28577bcb4c4232f623da92da1b597..eb4a5224539136f3c219c0bff71d99d09dfab36e 100644 (file)
@@ -1,10 +1,5 @@
 /* SPARC 'struct __new_sigaction' is similar to generic Linux UAPI with
    a sa_restorer field, even though function is passed as an argument
    to rt_sigaction syscall.  */
-#define SA_RESTORER 0x04000000
+#define HAS_SA_RESTORER 1
 #include <sysdeps/unix/sysv/linux/kernel_sigaction.h>
-
-#define SET_SA_RESTORER(kact, act)             \
-  (kact)->sa_restorer = NULL
-#define RESET_SA_RESTORER(act, kact)           \
-  (act)->sa_restorer = (kact)->sa_restorer
index 4e6d9cc32e1e18746726fa430d092de9a19ba6c6..9aa2c7f860b7c419269f46ab0a48f3c3982c24eb 100644 (file)
@@ -18,7 +18,6 @@
 
 #include <signal.h>
 #define SA_RESTORER 0x04000000
-#include <kernel_sigaction.h>
 
 extern void restore_rt (void) asm ("__restore_rt") attribute_hidden;
 
@@ -29,6 +28,8 @@ extern void restore_rt (void) asm ("__restore_rt") attribute_hidden;
 #define RESET_SA_RESTORER(act, kact)                   \
   (act)->sa_restorer = (kact)->sa_restorer
 
+#include <kernel_sigaction.h>
+
 #include <sysdeps/unix/sysv/linux/sigaction.c>
 
 /* NOTE: Please think twice before making any changes to the bits of