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
#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
/* --------------------------- leave-setcontext.c --------------------------- */
-# elif defined __sgi || defined __sun /* IRIX, Solaris */
+# elif defined __sun /* Solaris */
# include <ucontext.h>
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;
|| 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
|| (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
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;
# 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;
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);
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
])