diff options
author | Eike Rathke <erack@redhat.com> | 2016-03-15 17:39:03 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2016-03-15 17:41:23 +0100 |
commit | 29ee431c1cf859c3d5a5041cff5cb04b89db27a0 (patch) | |
tree | 11b445425b77fd163d58d10967a9215d4d3d372a | |
parent | b4d9ba8aa9c63c5e527bf640f136c77990eb6747 (diff) |
Resolves: tdf#93196 add RecursionCounter guard also to InterpretFormulaGroup()
... same as for ScFormulaCell::InterpretTail()
Change-Id: I444f259fe4e86ed0638a04f1b5d9272edd182e2e
-rw-r--r-- | sc/source/core/data/formulacell.cxx | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index 48314dd53971..d483ef7175c7 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -1499,6 +1499,28 @@ bool ScFormulaCell::MarkUsedExternalReferences() return pCode && pDocument->MarkUsedExternalReferences(*pCode, aPos); } +namespace { +class RecursionCounter +{ + ScRecursionHelper& rRec; + bool bStackedInIteration; +public: + RecursionCounter( ScRecursionHelper& r, ScFormulaCell* p ) : rRec(r) + { + bStackedInIteration = rRec.IsDoingIteration(); + if (bStackedInIteration) + rRec.GetRecursionInIterationStack().push( p); + rRec.IncRecursionCount(); + } + ~RecursionCounter() + { + rRec.DecRecursionCount(); + if (bStackedInIteration) + rRec.GetRecursionInIterationStack().pop(); + } +}; +} + void ScFormulaCell::Interpret() { #if DEBUG_CALCULATION @@ -1769,25 +1791,7 @@ void ScFormulaCell::Interpret() void ScFormulaCell::InterpretTail( ScInterpretTailParameter eTailParam ) { - class RecursionCounter - { - ScRecursionHelper& rRec; - bool bStackedInIteration; - public: - RecursionCounter( ScRecursionHelper& r, ScFormulaCell* p ) : rRec(r) - { - bStackedInIteration = rRec.IsDoingIteration(); - if (bStackedInIteration) - rRec.GetRecursionInIterationStack().push( p); - rRec.IncRecursionCount(); - } - ~RecursionCounter() - { - rRec.DecRecursionCount(); - if (bStackedInIteration) - rRec.GetRecursionInIterationStack().pop(); - } - } aRecursionCounter( pDocument->GetRecursionHelper(), this); + RecursionCounter aRecursionCounter( pDocument->GetRecursionHelper(), this); nSeenInIteration = pDocument->GetRecursionHelper().GetIteration(); if( !pCode->GetCodeLen() && !pCode->GetCodeError() ) { @@ -3979,6 +3983,12 @@ bool ScFormulaCell::InterpretFormulaGroup() if (!ScCalcConfig::isOpenCLEnabled() && !ScCalcConfig::isSwInterpreterEnabled()) return false; + // Guard against endless recursion of Interpret() calls, for this to work + // ScFormulaCell::InterpretFormulaGroup() must never be called through + // anything else than ScFormulaCell::Interpret(), same as + // ScFormulaCell::InterpretTail() + RecursionCounter aRecursionCounter( pDocument->GetRecursionHelper(), this); + // TODO : Disable invariant formula group interpretation for now in order // to get implicit intersection to work. if (mxGroup->mbInvariant && false) |