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
 }
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3327,
+/**/
     3326,
 /**/
     3325,