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 <caol...@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
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits