sc/inc/formulacell.hxx |   22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

New commits:
commit 4b3b1f01178f4ab079fd2d2c71dcf10753dc2680
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Thu Apr 1 23:51:46 2021 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Thu Apr 15 16:12:45 2021 +0200

    Work around assert() in circular reference within group calc, tdf#141146
    
    Triggered by crash test loading document of
    wget 'https://bz.apache.org/ooo/attachment.cgi?id=71756' -O ooo114587-1.ods
    
    after
    
        commit 042dbf83122b14fd1dd32705c8f8b7d65c22f21b
        CommitDate: Thu Mar 25 16:31:29 2021 +0100
    
            Resolves: tdf#141146 Fix LOOKUP in array with result
            scalar / single reference
    
    Though could happen any time whenever a shared formula group calc
    attempts to obtain a result from an already running cell.
    
    Change-Id: Id668b31a8d81389c593c6fd2191fd444efcdb70f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113494
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins
    (cherry picked from commit 465b8b0e9ad4b0c9c7701dee2820a99c5d00b5bf)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113633
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index 9be8b84df8a9..a6701bcbf0bd 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -23,11 +23,13 @@
 #include <memory>
 
 #include <formula/tokenarray.hxx>
+#include <formula/errorcodes.hxx>
 #include <svl/listener.hxx>
 
 #include "types.hxx"
 #include "interpretercontext.hxx"
 #include "document.hxx"
+#include "docoptio.hxx"
 #include "formulalogger.hxx"
 #include "formularesult.hxx"
 
@@ -437,15 +439,25 @@ public:
         return (rDocument.GetAutoCalc() || (cMatrixFlag != 
ScMatrixMode::NONE));
     }
 
-    bool MaybeInterpret()
+    void MaybeInterpret()
     {
         if (NeedsInterpret())
         {
-            assert(!rDocument.IsThreadedGroupCalcInProgress());
-            Interpret();
-            return true;
+            if (bRunning && !rDocument.GetDocOptions().IsIter() && 
rDocument.IsThreadedGroupCalcInProgress())
+            {
+                // This is actually copied from Interpret()'s if(bRunning)
+                // block that once caught this circular reference but now is
+                // prepended with various threaded group calc things which the
+                // assert() below is supposed to fail on when entering again.
+                // Nevertheless, we need some state here the caller can obtain.
+                aResult.SetResultError( FormulaError::CircularReference );
+            }
+            else
+            {
+                assert(!rDocument.IsThreadedGroupCalcInProgress());
+                Interpret();
+            }
         }
-        return false;
     }
 
     /**
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to