diff --git a/src/config.h.in b/src/config.h.in index 1b01633..9657556 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -497,6 +497,9 @@ /* Define to inline symbol or empty */ #undef inline +/* Define if _SC_SIGSTKSZ is available via sysconf() */ +#undef HAVE_SYSCONF_SIGSTKSZ + /* Do we need FIPS warning? */ #undef HAVE_FIPS_WARNING diff --git a/src/configure.ac b/src/configure.ac index aba4e1b..8a14a55 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -4137,6 +4137,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 ], +[ (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]) diff --git a/src/os_unix.c b/src/os_unix.c index 1edc7e6..fe12aba 100644 --- 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 }