From: Bruno Haible Date: Wed, 10 Sep 2025 21:04:32 +0000 (+0200) Subject: Remove support for IRIX regarding sigaltstack. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b84cb94f840827f5a2b989db016293f384810868;p=thirdparty%2Fgnulib.git 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. --- diff --git a/ChangeLog b/ChangeLog index 88931256cb..4c47faf1ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2025-09-10 Bruno Haible + 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 diff --git a/lib/sigsegv.c b/lib/sigsegv.c index 6d08999075..6cec1c5af0 100644 --- a/lib/sigsegv.c +++ b/lib/sigsegv.c @@ -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 @@ -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; diff --git a/lib/sigsegv.in.h b/lib/sigsegv.in.h index 2a94565c1b..842318550a 100644 --- a/lib/sigsegv.in.h +++ b/lib/sigsegv.in.h @@ -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; diff --git a/m4/sigaltstack.m4 b/m4/sigaltstack.m4 index 21cd103871..c57db73c3a 100644 --- a/m4/sigaltstack.m4 +++ b/m4/sigaltstack.m4 @@ -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 -#include -#if HAVE_SYS_SIGNAL_H -# include -#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 ])