# HG changeset patch # User Bram Moolenaar # Date 1614270604 -3600 # Node ID a77ea73f4db52b2e68143ea5859e798cfe79fe42 # Parent 4bce4a16cb664fd0052abab3e29f0d3a2e7f6922 patch 8.2.2550: signal stack size is wrong with latest glibc 2.34 Commit: https://github.com/vim/vim/commit/0e62a6742bca186624e97e2121c98ada30e009a0 Author: Bram Moolenaar Date: Thu Feb 25 17:17:56 2021 +0100 patch 8.2.2550: signal stack size is wrong with latest glibc 2.34 Problem: Signal stack size is wrong with latest glibc 2.34. Solution: Use sysconf(_SC_SIGSTKSZ) if available. (Zdenek Dohnal, closes #7895) diff --git a/src/auto/configure b/src/auto/configure --- a/src/auto/configure +++ b/src/auto/configure @@ -13943,6 +13943,30 @@ else 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 +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]];'. diff --git a/src/config.h.in b/src/config.h.in --- a/src/config.h.in +++ b/src/config.h.in @@ -496,3 +496,6 @@ /* Define to inline symbol or empty */ #undef inline + +/* Define if _SC_SIGSTKSZ is available via sysconf() */ +#undef HAVE_SYSCONF_SIGSTKSZ diff --git a/src/configure.ac b/src/configure.ac --- a/src/configure.ac +++ b/src/configure.ac @@ -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 ], +[ (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]) diff --git a/src/os_unix.c b/src/os_unix.c --- a/src/os_unix.c +++ b/src/os_unix.c @@ -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 } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2550, +/**/ 2549, /**/ 2548,