|
@@ -0,0 +1,84 @@
|
|
|
+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
|
|
|
+
|