1
0
mirror of https://https.git.savannah.gnu.org/git/gnulib.git synced 2026-05-13 15:13:36 +00:00

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.
This commit is contained in:
Bruno Haible
2025-09-10 23:04:32 +02:00
parent abe5d60f0e
commit b84cb94f84
4 changed files with 18 additions and 95 deletions

View File

@@ -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

View 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;

View 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;

View 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
])