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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
])
|
||||
|
||||
Reference in New Issue
Block a user