Mercurial > vim
changeset 24016:a77ea73f4db5 v8.2.2550
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 <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 25 Feb 2021 17:30:04 +0100 |
parents | 4bce4a16cb66 |
children | eb1bfaaffa52 |
files | src/auto/configure src/config.h.in src/configure.ac src/os_unix.c src/version.c |
diffstat | 5 files changed, 51 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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 <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]];'.
--- 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
--- 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 <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])
--- 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 }