From 69238f15129f35eb4756ad8e2004e0d7907cb175 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 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 <stdlib.h>
@@ -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

