]> granicus.if.org Git - vim/commitdiff
patch 8.2.2550: signal stack size is wrong with latest glibc 2.34 v8.2.2550
authorBram Moolenaar <Bram@vim.org>
Thu, 25 Feb 2021 16:17:56 +0000 (17:17 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 25 Feb 2021 16:17:56 +0000 (17:17 +0100)
Problem:    Signal stack size is wrong with latest glibc 2.34.
Solution:   Use sysconf(_SC_SIGSTKSZ) if available. (Zdenek Dohnal, closes
            #7895)

src/auto/configure
src/config.h.in
src/configure.ac
src/os_unix.c
src/version.c

index 250e5ae9ea255eff1f2612fa4405496106533695..818349991d00ff188eb318dee6d53867f251f79e 100755 (executable)
@@ -13943,6 +13943,30 @@ $as_echo "not usable" >&6; }
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _SC_SIGSTKSZ via sysconf()" >&5
+$as_echo_n "checking for _SC_SIGSTKSZ via sysconf()... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+int
+main ()
+{
+       (void)sysconf(_SC_SIGSTKSZ);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }; $as_echo "#define HAVE_SYSCONF_SIGSTKSZ 1" >>confdefs.h
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not usable" >&5
+$as_echo "not usable" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
 # The cast to long int works around a bug in the HP C Compiler
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
 # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
index b11448021f87a5939902fb92b97445d96dfa892c..5d01e2c4f70edef86515733252399e946dedfb93 100644 (file)
 
 /* Define to inline symbol or empty */
 #undef inline
+
+/* Define if _SC_SIGSTKSZ is available via sysconf() */
+#undef HAVE_SYSCONF_SIGSTKSZ
index 58bfa1980b8c5269741aed3fb6fcf0955d0924f4..798e9b8942ae19bf5533a23baede59c0dda18f67 100644 (file)
@@ -4105,6 +4105,15 @@ AC_TRY_COMPILE(
        AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCONF),
        AC_MSG_RESULT(not usable))
 
+dnl check if we have _SC_SIGSTKSZ via sysconf()
+AC_MSG_CHECKING(for _SC_SIGSTKSZ via sysconf())
+AC_TRY_COMPILE(
+[#include <unistd.h>],
+[      (void)sysconf(_SC_SIGSTKSZ);
+       ],
+       AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCONF_SIGSTKSZ),
+       AC_MSG_RESULT(not usable))
+
 AC_CHECK_SIZEOF([int])
 AC_CHECK_SIZEOF([long])
 AC_CHECK_SIZEOF([time_t])
index 1edc7e66ba671d085f0f28e61b8c33a87f4e25ab..1c807991741c254c9878e985090ee920b9747f0d 100644 (file)
@@ -783,7 +783,7 @@ mch_stackcheck(char *p)
  * completely full.
  */
 
-#ifndef SIGSTKSZ
+#if !defined SIGSTKSZ && !defined(HAVE_SYSCONF_SIGSTKSZ)
 # define SIGSTKSZ 8000    // just a guess of how much stack is needed...
 #endif
 
@@ -806,13 +806,21 @@ init_signal_stack(void)
 #  else
        sigstk.ss_sp = signal_stack;
 #  endif
+#  ifdef HAVE_SYSCONF_SIGSTKSZ
+       sigstk.ss_size = sysconf(_SC_SIGSTKSZ);
+#  else
        sigstk.ss_size = SIGSTKSZ;
+#  endif
        sigstk.ss_flags = 0;
        (void)sigaltstack(&sigstk, NULL);
 # else
        sigstk.ss_sp = signal_stack;
        if (stack_grows_downwards)
+#  ifdef HAVE_SYSCONF_SIGSTKSZ
+           sigstk.ss_sp += sysconf(_SC_SIGSTKSZ) - 1;
+#  else
            sigstk.ss_sp += SIGSTKSZ - 1;
+#  endif
        sigstk.ss_onstack = 0;
        (void)sigstack(&sigstk, NULL);
 # endif
@@ -3261,7 +3269,11 @@ mch_early_init(void)
      * Ignore any errors.
      */
 #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
+# ifdef HAVE_SYSCONF_SIGSTKSZ
+    signal_stack = alloc(sysconf(_SC_SIGSTKSZ));
+# else
     signal_stack = alloc(SIGSTKSZ);
+# endif
     init_signal_stack();
 #endif
 }
index ff82645516f5047d4a33bb6953f6c7190699cb9e..0ab83f7ab5aed652aada11e7e9846c752284e295 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2550,
 /**/
     2549,
 /**/