]> git.ipfire.org Git - thirdparty/gnulib.git/commitdiff
Remove support for IRIX regarding sigaltstack.
authorBruno Haible <bruno@clisp.org>
Wed, 10 Sep 2025 21:04:32 +0000 (23:04 +0200)
committerBruno Haible <bruno@clisp.org>
Wed, 10 Sep 2025 21:04:32 +0000 (23:04 +0200)
* m4/sigaltstack.m4 (SV_SIGALTSTACK): Assume that ss_sp is the start
address, not the end address, of the alternate stack area.
* lib/sigsegv.c: Remove code for IRIX.
(stackoverflow_install_handler): Ignore SIGALTSTACK_SS_REVERSED.
* lib/sigsegv.in.h: Remove code for IRIX.

ChangeLog
lib/sigsegv.c
lib/sigsegv.in.h
m4/sigaltstack.m4

index 88931256cbe32ad04e428f47a8b34ab32a2d1a17..4c47faf1ed21c076e670490debad2180305913d0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2025-09-10  Bruno Haible  <bruno@clisp.org>
 
+       Remove support for IRIX regarding sigaltstack.
+       * m4/sigaltstack.m4 (SV_SIGALTSTACK): Assume that ss_sp is the start
+       address, not the end address, of the alternate stack area.
+       * lib/sigsegv.c: Remove code for IRIX.
+       (stackoverflow_install_handler): Ignore SIGALTSTACK_SS_REVERSED.
+       * lib/sigsegv.in.h: Remove code for IRIX.
+
        Remove support for IRIX and Solaris <= 7 regarding old mmap.
        * m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Don't define HAVE_MAP_ANONYMOUS.
        * m4/memchr.m4 (gl_FUNC_MEMCHR): Assume that mmap supports MAP_ANONYMOUS
index 6d089990753b381e90e8506e95e8c1dba2ddcf08..6cec1c5af07ff8de44081da80f3887a8e9bed8d6 100644 (file)
@@ -708,18 +708,6 @@ int libsigsegv_version = LIBSIGSEGV_VERSION;
 
 #endif
 
-#if defined __sgi /* IRIX */
-
-# define SIGSEGV_FAULT_HANDLER_ARGLIST  int sig, int code, struct sigcontext *scp
-# define SIGSEGV_FAULT_ADDRESS  (unsigned long) scp->sc_badvaddr
-# define SIGSEGV_FAULT_CONTEXT  scp
-
-# if defined __mips__ || defined __mipsn32__ || defined __mips64__
-#  define SIGSEGV_FAULT_STACKPOINTER  scp->sc_regs[29]
-# endif
-
-#endif
-
 #if defined __sun /* Solaris */
 
 # define SIGSEGV_FAULT_HANDLER_ARGLIST  int sig, siginfo_t *sip, void *ucp
@@ -953,7 +941,7 @@ sigsegv_reset_onstack_flag (void)
 
 /* --------------------------- leave-setcontext.c --------------------------- */
 
-# elif defined __sgi || defined __sun /* IRIX, Solaris */
+# elif defined __sun /* Solaris */
 
 #  include <ucontext.h>
 
@@ -1438,13 +1426,8 @@ stackoverflow_install_handler (stackoverflow_handler_t handler,
   stk_extra_stack_size = extra_stack_size;
   {
     stack_t ss;
-# if SIGALTSTACK_SS_REVERSED
-    ss.ss_sp = (char *) extra_stack + extra_stack_size - sizeof (void *);
-    ss.ss_size = extra_stack_size - sizeof (void *);
-# else
     ss.ss_sp = extra_stack;
     ss.ss_size = extra_stack_size;
-# endif
     ss.ss_flags = 0; /* no SS_DISABLE */
     if (sigaltstack (&ss, (stack_t*)0) < 0)
       return -1;
index 2a94565c1b9428652e53c8e3995e6d18fe833cc0..842318550a09fc3d6138a94bedb6ce2e57e3fa99 100644 (file)
@@ -69,9 +69,9 @@
     || defined __NetBSD__ \
     || defined __OpenBSD__ \
     || (defined __APPLE__ && defined __MACH__) \
-    || defined _AIX || defined __sgi || defined __sun \
+    || defined _AIX || defined __sun \
     || defined __CYGWIN__ || defined __HAIKU__
-/* Linux, Hurd, GNU/kFreeBSD, FreeBSD, NetBSD, OpenBSD, macOS, AIX, IRIX, Solaris, Cygwin, Haiku */
+/* Linux, Hurd, GNU/kFreeBSD, FreeBSD, NetBSD, OpenBSD, macOS, AIX, Solaris, Cygwin, Haiku */
 # define HAVE_SIGSEGV_RECOVERY 1
 #endif
 
@@ -82,9 +82,9 @@
     || (defined __NetBSD__ && !(defined __sparc__ || defined __sparc64__)) \
     || defined __OpenBSD__ \
     || (defined __APPLE__ && defined __MACH__) \
-    || defined _AIX || defined __sgi || defined __sun \
+    || defined _AIX || defined __sun \
     || defined __CYGWIN__ || defined __HAIKU__
-/* Linux, Hurd, GNU/kFreeBSD, FreeBSD, NetBSD, OpenBSD, macOS, AIX, IRIX, Solaris, Cygwin, Haiku */
+/* Linux, Hurd, GNU/kFreeBSD, FreeBSD, NetBSD, OpenBSD, macOS, AIX, Solaris, Cygwin, Haiku */
 # define HAVE_STACK_OVERFLOW_RECOVERY 1
 #endif
 
@@ -189,7 +189,7 @@ extern int sigsegv_leave_handler (void (*continuation) (void*, void*, void*), vo
 typedef ucontext_t *stackoverflow_context_t;
 # elif defined __gnu_hurd__ \
        || defined __FreeBSD_kernel__ || (defined __FreeBSD__ && !(defined __sparc__ || defined __sparc64__)) || defined __DragonFly__ \
-       || defined __OpenBSD__ || defined __sgi
+       || defined __OpenBSD__
 typedef struct sigcontext *stackoverflow_context_t;
 # else
 typedef void *stackoverflow_context_t;
index 21cd103871d77837ca85f0c82408229d3019d155..c57db73c3a6b5a7e3d8cfdff86102f0b528c8feb 100644 (file)
@@ -1,5 +1,5 @@
 # sigaltstack.m4
-# serial 16
+# serial 17
 dnl Copyright (C) 2002-2025 Free Software Foundation, Inc.
 dnl This file is free software, distributed under the terms of the GNU
 dnl General Public License as published by the Free Software Foundation;
@@ -86,14 +86,13 @@ int main ()
   rl.rlim_cur = rl.rlim_max = 0x100000; /* 1 MB */
   setrlimit (RLIMIT_STACK, &rl);
 #endif
-  /* Install the alternate stack.  Use the midpoint of mystack, to guard
-     against a buggy interpretation of ss_sp on IRIX.  */
+  /* Install the alternate stack.  */
 #ifdef SIGSTKSZ
-  if (sizeof mystack / 2 < SIGSTKSZ)
+  if (sizeof mystack < SIGSTKSZ)
     exit (3);
 #endif
-  altstack.ss_sp = mystack + sizeof mystack / 2;
-  altstack.ss_size = sizeof mystack / 2;
+  altstack.ss_sp = mystack;
+  altstack.ss_size = sizeof mystack;
   altstack.ss_flags = 0; /* no SS_DISABLE */
   if (sigaltstack (&altstack, NULL) < 0)
     exit (1);
@@ -130,71 +129,5 @@ int main ()
   if test "$sv_cv_sigaltstack" != no; then
     AC_DEFINE([HAVE_WORKING_SIGALTSTACK], [1],
       [Define if you have the sigaltstack() function and it works.])
-
-    dnl The ss_sp field of a stack_t is, according to POSIX, the lowest address
-    dnl of the memory block designated as an alternate stack. But IRIX 5.3
-    dnl interprets it as the highest address!
-    AC_CACHE_CHECK([for correct stack_t interpretation],
-      [sv_cv_sigaltstack_low_base], [
-      AC_RUN_IFELSE([
-        AC_LANG_SOURCE([[
-#include <stdlib.h>
-#include <signal.h>
-#if HAVE_SYS_SIGNAL_H
-# include <sys/signal.h>
-#endif
-volatile char *stack_lower_bound;
-volatile char *stack_upper_bound;
-static void check_stack_location (volatile char *addr)
-{
-  if (addr >= stack_lower_bound && addr <= stack_upper_bound)
-    exit (0);
-  else
-    exit (1);
-}
-static void stackoverflow_handler (int sig)
-{
-  char dummy;
-  check_stack_location (&dummy);
-}
-char mystack[2 * (1 << 24)];
-int main ()
-{
-  stack_t altstack;
-  struct sigaction action;
-  /* Install the alternate stack.  */
-  altstack.ss_sp = mystack + sizeof mystack / 2;
-  altstack.ss_size = sizeof mystack / 2;
-  stack_lower_bound = (char *) altstack.ss_sp;
-  stack_upper_bound = (char *) altstack.ss_sp + altstack.ss_size - 1;
-  altstack.ss_flags = 0; /* no SS_DISABLE */
-  if (sigaltstack (&altstack, NULL) < 0)
-    exit (2);
-  /* Install the SIGSEGV handler.  */
-  sigemptyset (&action.sa_mask);
-  action.sa_handler = &stackoverflow_handler;
-  action.sa_flags = SA_ONSTACK;
-  if (sigaction (SIGSEGV, &action, (struct sigaction *) NULL) < 0)
-    exit(3);
-  /* Provoke a SIGSEGV.  */
-  raise (SIGSEGV);
-  exit (3);
-}]])],
-      [sv_cv_sigaltstack_low_base=yes],
-      [sv_cv_sigaltstack_low_base=no],
-      [
-        dnl FIXME: Put in some more known values here.
-        case "$host_os" in
-          irix5*) sv_cv_sigaltstack_low_base="no" ;;
-          *)      sv_cv_sigaltstack_low_base="guessing yes" ;;
-        esac
-      ])
-    ])
-    if test "$sv_cv_sigaltstack_low_base" = no; then
-      AC_DEFINE([SIGALTSTACK_SS_REVERSED], [1],
-        [Define if sigaltstack() interprets the stack_t.ss_sp field incorrectly,
-         as the highest address of the alternate stack range rather than as the
-         lowest address.])
-    fi
   fi
 ])