[Libreoffice-commits] core.git: sc/source
Dennis Francis
dennis.francis at collabora.co.uk
Thu Jun 21 08:14:11 UTC 2018
sc/source/core/data/formulacell.cxx | 17 +++++++++++++----
sc/source/core/tool/recursionhelper.cxx | 2 +-
2 files changed, 14 insertions(+), 5 deletions(-)
New commits:
commit b35fa7758d4eba2cac85527b0bd0c1dcf5ecfc09
Author: Dennis Francis <dennis.francis at collabora.co.uk>
Date: Fri May 25 12:09:41 2018 +0530
Do not do threaded group calc if...
the dependency computation resulted in a breach of
recursion limit of MAXRECURSION. In such a case,
the formula-group we are trying to thread is at the
bottom of recursion guard stack and the dependencies
(up the recursion guard stack) are yet to be computed,
so the formula-group is not safe for threading.
This patch fixes a crash in tdf#115034/1 when threading
is enabled.
Change-Id: I81737d3dd00f4e5cc782e9f030c18e36f6337a1b
Reviewed-on: https://gerrit.libreoffice.org/54789
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
Tested-by: Jenkins
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 2fd26955891c..2de28fc8d651 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -4405,8 +4405,9 @@ bool ScFormulaCell::InterpretFormulaGroup()
return false;
auto aScope = sc::FormulaLogger::get().enterGroup(*pDocument, *this);
+ ScRecursionHelper& rRecursionHelper = pDocument->GetRecursionHelper();
- if (pDocument->GetRecursionHelper().GetRecursionCount())
+ if (rRecursionHelper.GetRecursionCount())
{
// Do not attempt to interpret a group when calculations are already
// running, otherwise we may run into a circular reference hell. See
@@ -4441,7 +4442,7 @@ bool ScFormulaCell::InterpretFormulaGroup()
// ScFormulaCell::InterpretFormulaGroup() must never be called through
// anything else than ScFormulaCell::Interpret(), same as
// ScFormulaCell::InterpretTail()
- RecursionCounter aRecursionCounter( pDocument->GetRecursionHelper(), this);
+ RecursionCounter aRecursionCounter( rRecursionHelper, this);
// Preference order:
// First try OpenCL, but only if actual OpenCL is available (i.e. no SwInterpreter).
@@ -4473,7 +4474,16 @@ bool ScFormulaCell::InterpretFormulaGroupThreading(sc::FormulaLogger::GroupScope
// Disable or hugely enlarge subset for S/W group
// threading interpreter
- if (!aCalculator.DoIt())
+ bool bOKToThread = aCalculator.DoIt();
+
+ if (pDocument->GetRecursionHelper().IsInRecursionReturn())
+ {
+ mxGroup->meCalcState = sc::GroupCalcDisabled;
+ aScope.addMessage("Recursion limit reached, cannot thread this formula group now");
+ return false;
+ }
+
+ if (!bOKToThread)
{
mxGroup->meCalcState = sc::GroupCalcDisabled;
aScope.addMessage("could not do new dependencies calculation thing");
@@ -4535,7 +4545,6 @@ bool ScFormulaCell::InterpretFormulaGroupThreading(sc::FormulaLogger::GroupScope
nThreadCount /= 2;
SAL_INFO("sc.threaded", "Running " << nThreadCount << " threads");
-
{
assert(!pDocument->IsThreadedGroupCalcInProgress());
pDocument->SetThreadedGroupCalcInProgress(true);
diff --git a/sc/source/core/tool/recursionhelper.cxx b/sc/source/core/tool/recursionhelper.cxx
index de75e8557605..665ee2ae7aeb 100644
--- a/sc/source/core/tool/recursionhelper.cxx
+++ b/sc/source/core/tool/recursionhelper.cxx
@@ -16,7 +16,7 @@ void ScRecursionHelper::Init()
bInRecursionReturn = bDoingRecursion = bInIterationReturn = false;
aInsertPos = GetIterationEnd();
ResetIteration();
- aFGList.clear();
+ // Must not force clear aFGList ever.
}
void ScRecursionHelper::ResetIteration()
More information about the Libreoffice-commits
mailing list