From 69238f15129f35eb4756ad8e2004e0d7907cb175 Mon Sep 17 00:00:00 2001 From: Khem Raj 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 --- 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 5353c08..863f764 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 @@ -131,7 +132,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 @@ -203,10 +205,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; @@ -279,14 +282,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