summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2020-01-17 19:03:23 +0000
committerMichael Meeks <michael.meeks@collabora.com>2020-01-18 17:23:02 +0100
commitb72f37826edf742eb7d9cf4fd0ac73b2a2e2096b (patch)
treec1958da91e8f36d22ba5e3b711c67ec0a2fb4953
parentc92682c8132786cf5bee7c3468ba338220465324 (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.cpp20
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);