[Libreoffice-commits] online.git: common/SigUtil.cpp

Michael Meeks (via logerrit) logerrit at kemper.freedesktop.org
Sat Jan 18 16:23:20 UTC 2020


 common/SigUtil.cpp |   20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)

New commits:
commit b72f37826edf742eb7d9cf4fd0ac73b2a2e2096b
Author:     Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Fri Jan 17 19:03:23 2020 +0000
Commit:     Michael Meeks <michael.meeks at collabora.com>
CommitDate: Sat Jan 18 17:23:02 2020 +0100

    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 at gmail.com>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>

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);


More information about the Libreoffice-commits mailing list