From dee3186eca21211a0e031f5489b32326a3b9ddd2 Mon Sep 17 00:00:00 2001 From: Philip Pronin Date: Thu, 10 Dec 2015 16:15:37 -0800 Subject: [PATCH 1/1] setup signal handler with SA_ONSTACK Summary: By default signal handlers are run on the signaled thread's stack. In case of stack overflow running the `SIGSEGV` signal handler on the same stack leads to another `SIGSEGV` and crashes the program Use `SA_ONSTACK`, so alternate stack is used (only if configured via `sigaltstack`). Reviewed By: luciang Differential Revision: D2747021 fb-gh-sync-id: 48388acd6147e2919412ec32acfca1ca76f22a16 --- folly/experimental/symbolizer/SignalHandler.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/folly/experimental/symbolizer/SignalHandler.cpp b/folly/experimental/symbolizer/SignalHandler.cpp index 5ec13bdf..86434f8b 100644 --- a/folly/experimental/symbolizer/SignalHandler.cpp +++ b/folly/experimental/symbolizer/SignalHandler.cpp @@ -322,7 +322,12 @@ void installFatalSignalHandler() { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sigemptyset(&sa.sa_mask); - sa.sa_flags |= SA_SIGINFO; + // By default signal handlers are run on the signaled thread's stack. + // In case of stack overflow running the SIGSEGV signal handler on + // the same stack leads to another SIGSEGV and crashes the program. + // Use SA_ONSTACK, so alternate stack is used (only if configured via + // sigaltstack). + sa.sa_flags |= SA_SIGINFO | SA_ONSTACK; sa.sa_sigaction = &signalHandler; for (auto p = kFatalSignals; p->name; ++p) { -- 2.34.1