From 145fee04faf1ce088d3a104677c49a5e91ac0e23 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 23 Apr 2019 18:41:20 +0100 Subject: [PATCH] Add sigaltstack support to Unix crashlog --- config.lib | 23 +++++++++++++++++++++++ src/os/unix/crashlog_unix.cpp | 13 ++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/config.lib b/config.lib index 45ceb05a71..44758cbbea 100644 --- a/config.lib +++ b/config.lib @@ -1807,6 +1807,29 @@ EOL log 1 "checking ucontext... found" CFLAGS="$CFLAGS -DWITH_UCONTEXT" fi + + log 2 "executing $cc_host $CFLAGS $CFLAGS_ENV $LDFLAGS $LDFLAGS_ENV $STATIC_FLAGS -o tmp.config.sigaltstack -x c++ - -ldl" + "$cc_host" $CFLAGS $CFLAGS_ENV $LDFLAGS $LDFLAGS_ENV $STATIC_FLAGS -o tmp.config.sigaltstack -x c++ - -ldl 2> /dev/null << EOL + #include + #include + int main() { + stack_t ss; + ss.ss_sp = calloc(SIGSTKSZ, 1); + ss.ss_size = SIGSTKSZ; + ss.ss_flags = 0; + sigaltstack(&ss, nullptr); + return 0; + } +EOL + ret=$? + rm -f tmp.config.sigaltstack + log 2 " exit code $ret" + if [ $ret -ne 0 ]; then + log 1 "checking sigaltstack... no" + else + log 1 "checking sigaltstack... found" + CFLAGS="$CFLAGS -DWITH_SIGALTSTACK" + fi fi if [ "$os" = "MINGW" ]; then diff --git a/src/os/unix/crashlog_unix.cpp b/src/os/unix/crashlog_unix.cpp index a44151bb82..4eb315d3f8 100644 --- a/src/os/unix/crashlog_unix.cpp +++ b/src/os/unix/crashlog_unix.cpp @@ -341,7 +341,7 @@ class CrashLogUnix : public CrashLog { args.push_back("-ex"); args.push_back("echo \\nBacktrace:\\n"); args.push_back("-ex"); - args.push_back("bt full"); + args.push_back("bt full 100"); #ifdef WITH_SIGACTION if (this->GetMessage() == NULL && this->signal_instruction_ptr_valid) { @@ -584,11 +584,22 @@ static void CDECL HandleCrash(int signum) /* static */ void CrashLog::InitialiseCrashLog() { +#ifdef WITH_SIGALTSTACK + const size_t stack_size = max(SIGSTKSZ, 512*1024); + stack_t ss; + ss.ss_sp = CallocT(stack_size); + ss.ss_size = stack_size; + ss.ss_flags = 0; + sigaltstack(&ss, nullptr); +#endif for (const int *i = _signals_to_handle; i != endof(_signals_to_handle); i++) { #ifdef WITH_SIGACTION struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_flags = SA_SIGINFO | SA_RESTART; +#ifdef WITH_SIGALTSTACK + sa.sa_flags |= SA_ONSTACK; +#endif sigemptyset(&sa.sa_mask); sa.sa_sigaction = HandleCrash; sigaction(*i, &sa, NULL);