diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2020-01-17 19:03:23 +0000 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2020-01-18 17:23:02 +0100 |
commit | b72f37826edf742eb7d9cf4fd0ac73b2a2e2096b (patch) | |
tree | c1958da91e8f36d22ba5e3b711c67ec0a2fb4953 | |
parent | c92682c8132786cf5bee7c3468ba338220465324 (diff) |
sighandler: break infinite loop with corrupted heap
ignoring the segv can lead to not making progress, while churning debug.
Change-Id: I97af266cec3feefe2dcbd9adb8dbf4b13a4d69bd
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/87002
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r-- | common/SigUtil.cpp | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/common/SigUtil.cpp b/common/SigUtil.cpp index 8fe38b721..881326df5 100644 --- a/common/SigUtil.cpp +++ b/common/SigUtil.cpp @@ -237,19 +237,16 @@ namespace SigUtil void handleFatalSignal(const int signal) { SigHandlerTrap guard; - if (!guard.isExclusive()) - { - Log::signalLogPrefix(); - Log::signalLog(" Fatal double signal received: "); - Log::signalLog(signalName(signal)); - Log::signalLog("\n Already handling a signal; will ignore this."); - return; - } + bool bReEntered = !guard.isExclusive(); Log::signalLogPrefix(); - Log::signalLog(" Fatal signal received: "); + + // Heap corruption can re-enter through backtrace. + if (bReEntered) + Log::signalLog(" Fatal double signal received: "); + else + Log::signalLog(" Fatal signal received: "); Log::signalLog(signalName(signal)); - Log::signalLog("\n"); struct sigaction action; @@ -259,7 +256,8 @@ namespace SigUtil sigaction(signal, &action, nullptr); - dumpBacktrace(); + if (!bReEntered) + dumpBacktrace(); // let default handler process the signal kill(getpid(), signal); |