[Libreoffice-commits] core.git: sc/source

Caolán McNamara caolanm at redhat.com
Thu Apr 2 05:20:59 PDT 2015


 sc/source/core/data/formulacell.cxx         |    3 ++-
 sc/source/core/data/grouptokenconverter.cxx |   13 +++++++++++--
 sc/source/core/inc/grouptokenconverter.hxx  |    2 +-
 3 files changed, 14 insertions(+), 4 deletions(-)

New commits:
commit ea441294e15b23f703f139055e9a18287745ca23
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Apr 2 13:19:32 2015 +0100

    avoid endless recursion in fdo84763-2.ods
    
    Change-Id: I7052ad735ee7f804fe2817ea44527a4b95a2dd04

diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index bf97845..3ba5fc2 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3798,7 +3798,8 @@ bool ScFormulaCell::InterpretFormulaGroup()
     ScAddress aTopPos = aPos;
     aTopPos.SetRow(mxGroup->mpTopCell->aPos.Row());
     ScGroupTokenConverter aConverter(aCode, *pDocument, *this, mxGroup->mpTopCell->aPos);
-    if (!aConverter.convert(*pCode))
+    std::vector<ScTokenArray*> aLoopControl;
+    if (!aConverter.convert(*pCode, aLoopControl))
     {
         SAL_INFO("sc.opencl", "conversion of group " << this << " failed, disabling");
         mxGroup->meCalcState = sc::GroupCalcDisabled;
diff --git a/sc/source/core/data/grouptokenconverter.cxx b/sc/source/core/data/grouptokenconverter.cxx
index da3964c..de3fbf2 100644
--- a/sc/source/core/data/grouptokenconverter.cxx
+++ b/sc/source/core/data/grouptokenconverter.cxx
@@ -89,7 +89,7 @@ ScGroupTokenConverter::ScGroupTokenConverter(ScTokenArray& rGroupTokens, ScDocum
 {
 }
 
-bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
+bool ScGroupTokenConverter::convert(ScTokenArray& rCode, std::vector<ScTokenArray*>& rConversionStack)
 {
 #if 0
     { // debug to start with:
@@ -232,7 +232,16 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
 
                 mrGroupTokens.AddOpCode(ocOpen);
 
-                if (!convert(*pNamedTokens))
+                if (std::find(rConversionStack.begin(), rConversionStack.end(), pNamedTokens) != rConversionStack.end())
+                {
+                    SAL_WARN("sc", "loop in recursive ScGroupTokenConverter::convert");
+                    return false;
+                }
+
+                rConversionStack.push_back(pNamedTokens);
+                bool bOk = convert(*pNamedTokens, rConversionStack);
+                rConversionStack.pop_back();
+                if (!bOk)
                     return false;
 
                 mrGroupTokens.AddOpCode(ocClose);
diff --git a/sc/source/core/inc/grouptokenconverter.hxx b/sc/source/core/inc/grouptokenconverter.hxx
index 9685681..b221363 100644
--- a/sc/source/core/inc/grouptokenconverter.hxx
+++ b/sc/source/core/inc/grouptokenconverter.hxx
@@ -30,7 +30,7 @@ class SC_DLLPUBLIC ScGroupTokenConverter
 public:
     ScGroupTokenConverter(ScTokenArray& rGroupTokens, ScDocument& rDoc, ScFormulaCell& rCell, const ScAddress& rPos);
 
-    bool convert(ScTokenArray& rCode);
+    bool convert(ScTokenArray& rCode, std::vector<ScTokenArray*>& rConversionStack);
 };
 
 #endif // INCLUDED_SC_SOURCE_CORE_INC_GROUPTOKENCONVERTER_HXX


More information about the Libreoffice-commits mailing list