Commit a6754a7c authored by Dan Melnic's avatar Dan Melnic Committed by Facebook Github Bot

Fix gFatalSignalCallbackRegistry SIOF issue

Summary: Fix gFatalSignalCallbackRegistry SIOF issue

Reviewed By: yfeldblum

Differential Revision: D13317694

fbshipit-source-id: a828901dd42841b83a464ae759b7461b7d8fdca1
parent f53901c9
...@@ -86,9 +86,13 @@ void FatalSignalCallbackRegistry::run() { ...@@ -86,9 +86,13 @@ void FatalSignalCallbackRegistry::run() {
} }
} }
// Leak it so we don't have to worry about destruction order static FatalSignalCallbackRegistry* getFatalSignalCallbackRegistry() {
FatalSignalCallbackRegistry* gFatalSignalCallbackRegistry = // Leak it so we don't have to worry about destruction order
new FatalSignalCallbackRegistry; static FatalSignalCallbackRegistry* gFatalSignalCallbackRegistry =
new FatalSignalCallbackRegistry();
return gFatalSignalCallbackRegistry;
}
struct { struct {
int number; int number;
...@@ -417,7 +421,7 @@ void innerSignalHandler(int signum, siginfo_t* info, void* /* uctx */) { ...@@ -417,7 +421,7 @@ void innerSignalHandler(int signum, siginfo_t* info, void* /* uctx */) {
gStackTracePrinter->printStackTrace(true); // with symbolization gStackTracePrinter->printStackTrace(true); // with symbolization
// Run user callbacks // Run user callbacks
gFatalSignalCallbackRegistry->run(); getFatalSignalCallbackRegistry()->run();
} }
void signalHandler(int signum, siginfo_t* info, void* uctx) { void signalHandler(int signum, siginfo_t* info, void* uctx) {
...@@ -436,11 +440,11 @@ void signalHandler(int signum, siginfo_t* info, void* uctx) { ...@@ -436,11 +440,11 @@ void signalHandler(int signum, siginfo_t* info, void* uctx) {
} // namespace } // namespace
void addFatalSignalCallback(SignalCallback cb) { void addFatalSignalCallback(SignalCallback cb) {
gFatalSignalCallbackRegistry->add(cb); getFatalSignalCallbackRegistry()->add(cb);
} }
void installFatalSignalCallbacks() { void installFatalSignalCallbacks() {
gFatalSignalCallbackRegistry->markInstalled(); getFatalSignalCallbackRegistry()->markInstalled();
} }
namespace { namespace {
...@@ -471,6 +475,10 @@ void installFatalSignalHandler() { ...@@ -471,6 +475,10 @@ void installFatalSignalHandler() {
return; return;
} }
// make sure gFatalSignalCallbackRegistry is created before we
// install the fatal signal handler
getFatalSignalCallbackRegistry();
// If a small sigaltstack is enabled (ex. Rust stdlib might use sigaltstack // If a small sigaltstack is enabled (ex. Rust stdlib might use sigaltstack
// to set a small stack), the default SafeStackTracePrinter would likely // to set a small stack), the default SafeStackTracePrinter would likely
// stack overflow. Replace it with the unsafe self-allocate printer. // stack overflow. Replace it with the unsafe self-allocate printer.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment