Mercurial > vim
changeset 25581:b8aa2c93d156 v8.2.3327
patch 8.2.3327: no check for sysconf() failing
Commit: https://github.com/vim/vim/commit/ba9c23e77655766f6c59de8be732b7577f795ed3
Author: Zdenek Dohnal <zdohnal@redhat.com>
Date: Wed Aug 11 14:20:05 2021 +0200
patch 8.2.3327: no check for sysconf() failing
Problem: No check for sysconf() failing.
Solution: If sysconf() fails use SIGSTKSZ for the signal stack size.
(Zdenek Dohnal, closes #8743)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 11 Aug 2021 14:30:05 +0200 |
parents | 540ac90ccb0c |
children | 38e113f68d1e |
files | src/os_unix.c src/version.c |
diffstat | 2 files changed, 29 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/src/os_unix.c +++ b/src/os_unix.c @@ -783,16 +783,36 @@ mch_stackcheck(char *p) * completely full. */ -#if !defined SIGSTKSZ && !defined(HAVE_SYSCONF_SIGSTKSZ) -# define SIGSTKSZ 8000 // just a guess of how much stack is needed... -#endif - # ifdef HAVE_SIGALTSTACK static stack_t sigstk; // for sigaltstack() # else static struct sigstack sigstk; // for sigstack() # endif +/* + * Get a size of signal stack. + * Preference (if available): sysconf > SIGSTKSZ > guessed size + */ +static long int get_signal_stack_size() +{ +# ifdef HAVE_SYSCONF_SIGSTKSZ + long int size = -1; + + // return size only if sysconf doesn't return an error + if ((size = sysconf(_SC_SIGSTKSZ)) > -1) + return size; +# endif + +# ifdef SIGSTKSZ + // if sysconf() isn't available or gives error, return SIGSTKSZ + // if defined + return SIGSTKSZ; +# endif + + // otherwise guess the size + return 8000; +} + static char *signal_stack; static void @@ -806,21 +826,13 @@ 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_size = get_signal_stack_size(); 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_sp += get_signal_stack_size() - 1; sigstk.ss_onstack = 0; (void)sigstack(&sigstk, NULL); # endif @@ -3278,11 +3290,7 @@ 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 + signal_stack = alloc(get_signal_stack_size()); init_signal_stack(); #endif }