summaryrefslogtreecommitdiff
path: root/src/os_unix.c
diff options
context:
space:
mode:
authorZdenek Dohnal <zdohnal@redhat.com>2021-08-11 14:20:05 +0200
committerBram Moolenaar <Bram@vim.org>2021-08-11 14:20:05 +0200
commitba9c23e77655766f6c59de8be732b7577f795ed3 (patch)
treee410325ec1f91c7c267fdcdbfa753cfaaaf57ce7 /src/os_unix.c
parent6e48b84c5f08a7e192817aca0d8278ea2ff82bc7 (diff)
downloadvim-git-ba9c23e77655766f6c59de8be732b7577f795ed3.tar.gz
patch 8.2.3327: no check for sysconf() failingv8.2.3327
Problem: No check for sysconf() failing. Solution: If sysconf() fails use SIGSTKSZ for the signal stack size. (Zdenek Dohnal, closes #8743)
Diffstat (limited to 'src/os_unix.c')
-rw-r--r--src/os_unix.c46
1 files changed, 27 insertions, 19 deletions
diff --git a/src/os_unix.c b/src/os_unix.c
index 56ee764b0..b603927e3 100644
--- 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
}