123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- From 87b3a8f9ceb2cf0a5c8b72e460465fb9ff2d62d9 Mon Sep 17 00:00:00 2001
- From: Khem Raj <raj.khem@gmail.com>
- Date: Fri, 30 Apr 2021 17:40:36 -0700
- Subject: [PATCH] c-stack: stop using SIGSTKSZ
- This patch is required with glibc 2.34+
- based on gnulib [1]
- [1] https://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=f9e2b20a12a230efa30f1d479563ae07d276a94b
- Upstream-Status: Pending
- Signed-off-by: Khem Raj <raj.khem@gmail.com>
- ---
- lib/c-stack.c | 22 +++++++++++++---------
- 1 file changed, 13 insertions(+), 9 deletions(-)
- diff --git a/lib/c-stack.c b/lib/c-stack.c
- index 9bbe6fe..e0874c9 100644
- --- a/lib/c-stack.c
- +++ b/lib/c-stack.c
- @@ -51,13 +51,14 @@
- typedef struct sigaltstack stack_t;
- #endif
- #ifndef SIGSTKSZ
- -# define SIGSTKSZ 16384
- -#elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
- +#define get_sigstksz() (16384)
- +#elif HAVE_LIBSIGSEGV
- /* libsigsegv 2.6 through 2.8 have a bug where some architectures use
- more than the Linux default of an 8k alternate stack when deciding
- if a fault was caused by stack overflow. */
- -# undef SIGSTKSZ
- -# define SIGSTKSZ 16384
- +#define get_sigstksz() ((SIGSTKSZ) < 16384 ? 16384 : (SIGSTKSZ))
- +#else
- +#define get_sigstksz() ((SIGSTKSZ))
- #endif
-
- #include <stdlib.h>
- @@ -136,7 +137,8 @@ die (int signo)
- /* Storage for the alternate signal stack. */
- static union
- {
- - char buffer[SIGSTKSZ];
- + /* allocate buffer with size from get_sigstksz() */
- + char *buffer;
-
- /* These other members are for proper alignment. There's no
- standard way to guarantee stack alignment, but this seems enough
- @@ -208,10 +210,11 @@ c_stack_action (void (*action) (int))
- program_error_message = _("program error");
- stack_overflow_message = _("stack overflow");
-
- + alternate_signal_stack.buffer = malloc(get_sigstksz());
- /* Always install the overflow handler. */
- if (stackoverflow_install_handler (overflow_handler,
- alternate_signal_stack.buffer,
- - sizeof alternate_signal_stack.buffer))
- + get_sigstksz()))
- {
- errno = ENOTSUP;
- return -1;
- @@ -284,14 +287,15 @@ c_stack_action (void (*action) (int))
- stack_t st;
- struct sigaction act;
- st.ss_flags = 0;
- + alternate_signal_stack.buffer = malloc(get_sigstksz());
- # if SIGALTSTACK_SS_REVERSED
- /* Irix mistakenly treats ss_sp as the upper bound, rather than
- lower bound, of the alternate stack. */
- - st.ss_sp = alternate_signal_stack.buffer + SIGSTKSZ - sizeof (void *);
- - st.ss_size = sizeof alternate_signal_stack.buffer - sizeof (void *);
- + st.ss_sp = alternate_signal_stack.buffer + get_sigstksz() - sizeof (void *);
- + st.ss_size = get_sigstksz() - sizeof (void *);
- # else
- st.ss_sp = alternate_signal_stack.buffer;
- - st.ss_size = sizeof alternate_signal_stack.buffer;
- + st.ss_size = get_sigstksz();
- # endif
- r = sigaltstack (&st, NULL);
- if (r != 0)
- --
- 2.31.1
|