Bram Moolenaar
unread,Aug 11, 2021, 8:20:46 AM8/11/21Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to vim...@googlegroups.com
Patch 8.2.3327
Problem: No check for sysconf() failing.
Solution: If sysconf() fails use SIGSTKSZ for the signal stack size.
(Zdenek Dohnal, closes #8743)
Files: src/os_unix.c
*** ../vim-8.2.3326/src/os_unix.c 2021-06-23 21:13:17.325564860 +0200
--- src/os_unix.c 2021-08-11 14:17:33.735510397 +0200
***************
*** 783,798 ****
* 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
static char *signal_stack;
static void
--- 783,818 ----
* completely full.
*/
# 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,826 ****
# 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
--- 826,838 ----
# else
sigstk.ss_sp = signal_stack;
# 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)
! sigstk.ss_sp += get_signal_stack_size() - 1;
sigstk.ss_onstack = 0;
(void)sigstack(&sigstk, NULL);
# endif
***************
*** 3278,3288 ****
* 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
}
--- 3290,3296 ----
* Ignore any errors.
*/
#if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
! signal_stack = alloc(get_signal_stack_size());
init_signal_stack();
#endif
}
*** ../vim-8.2.3326/src/version.c 2021-08-10 22:51:59.369449616 +0200
--- src/version.c 2021-08-11 14:19:01.783323507 +0200
***************
*** 757,758 ****
--- 757,760 ----
{ /* Add new patch number below this line */
+ /**/
+ 3327,
/**/