From: Philip Pronin Date: Fri, 11 Dec 2015 00:15:37 +0000 (-0800) Subject: setup signal handler with SA_ONSTACK X-Git-Tag: deprecate-dynamic-initializer~190 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=dee3186eca21211a0e031f5489b32326a3b9ddd2;p=folly.git 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 --- 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) {