Avoid stack overflow in testTdf124815 on Windows

Desktop / LibreOffice - Mike Kaganski [collabora.com] - 16 March 2020 13:02 EDT

Regression from commit 2af67c35d283abefe6030a5b90b831b0b797dd62.

It happens in row 217, in a recursive calculation of cell values, starting on row 454 down to 0, with 237 repeated patterns on stack:


ucrtbased.dll!__acrt_FlsGetValue(unsigned long fls_index) Line 472 ucrtbased.dll!__crt_state_management::get_current_state_index() Line 101 ucrtbased.dll!__crt_state_management::dual_state_global::value() Line 147 ucrtbased.dll!_query_new_mode() Line 30 ucrtbased.dll!heap_alloc_dbg(const unsigned __int64 size, const int block_use, const char * const file_name, const int line_number) Line 447 ucrtbased.dll!_malloc_dbg(unsigned __int64 size, int block_use, const char * file_name, int line_number) Line 496 ucrtbased.dll!malloc(unsigned __int64 size) Line 27 sclo.dll!operator new(unsigned __int64 size) Line 35 sclo.dll!std::_Default_allocate_traits::_Allocate(const unsigned __int64 _Bytes) Line 52 sclo.dll!std::_Allocate<16,std::_Default_allocate_traits,0>(const unsigned __int64 _Bytes) Line 180 sclo.dll!std::allocator::allocate(const unsigned __int64 _Count) Line 785 sclo.dll!std::_Container_base12::_Alloc_proxy>(std::allocator && _Al) Line 1098 sclo.dll!std::vector>::vector>() Line 445 sclo.dll!sc::TokenStringContext::TokenStringContext(const ScDocument * pDoc, formula::FormulaGrammar::Grammar eGram) Line 38 sclo.dll!sc::FormulaLogger::GroupScope::Impl::Impl(sc::FormulaLogger & rLogger, const rtl::OUString & rPrefix, const ScDocument & rDoc, const ScFormulaCell & rCell, bool bOutputEnabled) Line 80 sclo.dll!std::make_unique(sc::FormulaLogger & <_Args_0>, const rtl::OUString & <_Args_1>, const ScDocument & <_Args_2>, const ScFormulaCell & <_Args_3>, bool & <_Args_4>) Line 2055 sclo.dll!sc::FormulaLogger::GroupScope::GroupScope(sc::FormulaLogger & rLogger, const rtl::OUString & rPrefix, const ScDocument & rDoc, const ScFormulaCell & rCell, bool bOutputEnabled) Line 127 sclo.dll!sc::FormulaLogger::enterGroup(const ScDocument & rDoc, const ScFormulaCell & rCell) Line 352 sclo.dll!ScFormulaCell::InterpretFormulaGroup(long nStartOffset, long nEndOffset) Line 4573 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1606 sclo.dll!ScFormulaCell::MaybeInterpret() Line 446 sclo.dll!ScFormulaCell::GetErrCode() Line 2956 sclo.dll!ScInterpreter::GetCellValueOrZero(const ScAddress & rPos, ScRefCellValue & rCell) Line 202 sclo.dll!ScInterpreter::GetCellValue(const ScAddress & rPos, ScRefCellValue & rCell) Line 186 sclo.dll!ScInterpreter::GetDouble() Line 2088 sclo.dll!ScInterpreter::CalculateAddSub(bool _bSub) Line 1277 sclo.dll!ScInterpreter::ScAdd() Line 1261 sclo.dll!ScInterpreter::Interpret() Line 4032 sclo.dll!ScFormulaCell::InterpretTail(ScInterpreterContext & rContext, ScFormulaCell::ScInterpretTailParameter eTailParam) Line 1939 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1632



sclo.dll!ScFormulaCell::MaybeInterpret() Line 446 sclo.dll!ScFormulaCell::GetErrCode() Line 2956 sclo.dll!ScInterpreter::GetCellValueOrZero(const ScAddress & rPos, ScRefCellValue & rCell) Line 202 sclo.dll!ScInterpreter::GetCellValue(const ScAddress & rPos, ScRefCellValue & rCell) Line 186 sclo.dll!ScInterpreter::GetDouble() Line 2088 sclo.dll!ScInterpreter::CalculateAddSub(bool _bSub) Line 1300 sclo.dll!ScInterpreter::ScAdd() Line 1261 sclo.dll!ScInterpreter::Interpret() Line 4032 sclo.dll!ScFormulaCell::InterpretTail(ScInterpreterContext & rContext, ScFormulaCell::ScInterpretTailParameter eTailParam) Line 1939 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1632 sclo.dll!ScFormulaCell::MaybeInterpret() Line 446 sclo.dll!ScFormulaCell::GetErrCode() Line 2956 sclo.dll!ScInterpreter::GetCellValueOrZero(const ScAddress & rPos, ScRefCellValue & rCell) Line 202 sclo.dll!ScInterpreter::GetCellValue(const ScAddress & rPos, ScRefCellValue & rCell) Line 186 sclo.dll!ScInterpreter::GetDouble() Line 2088 sclo.dll!ScInterpreter::CalculateAddSub(bool _bSub) Line 1300 sclo.dll!ScInterpreter::ScAdd() Line 1261 sclo.dll!ScInterpreter::Interpret() Line 4032 sclo.dll!ScFormulaCell::InterpretTail(ScInterpreterContext & rContext, ScFormulaCell::ScInterpretTailParameter eTailParam) Line 1939 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1632 sclo.dll!ScFormulaCell::MaybeInterpret() Line 446 sclo.dll!ScFormulaCell::GetErrCode() Line 2956 sclo.dll!ScInterpreter::GetCellValueOrZero(const ScAddress & rPos, ScRefCellValue & rCell) Line 202 sclo.dll!ScInterpreter::GetCellValue(const ScAddress & rPos, ScRefCellValue & rCell) Line 186 sclo.dll!ScInterpreter::GetDouble() Line 2088 sclo.dll!ScInterpreter::CalculateAddSub(bool _bSub) Line 1300 sclo.dll!ScInterpreter::ScAdd() Line 1261 sclo.dll!ScInterpreter::Interpret() Line 4032 sclo.dll!ScFormulaCell::InterpretTail(ScInterpreterContext & rContext, ScFormulaCell::ScInterpretTailParameter eTailParam) Line 1939 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1632 sclo.dll!ScFormulaCell::MaybeInterpret() Line 446 sclo.dll!ScFormulaCell::GetErrCode() Line 2956 sclo.dll!ScInterpreter::PushCellResultToken(bool bDisplayEmptyAsString, const ScAddress & rAddress, SvNumFormatType * pRetTypeExpr, unsigned long * pRetIndexExpr, bool bFinalResult) Line 703 sclo.dll!ScInterpreter::CalculateLookup(bool bHLookup) Line 7451 sclo.dll!ScInterpreter::ScVLookup() Line 7519 sclo.dll!ScInterpreter::Interpret() Line 4254 sclo.dll!ScFormulaCell::InterpretTail(ScInterpreterContext & rContext, ScFormulaCell::ScInterpretTailParameter eTailParam) Line 1939 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1632 sclo.dll!ScFormulaCell::MaybeInterpret() Line 446 sclo.dll!ScFormulaCell::IsEmpty() Line 2733 sclo.dll!ScRefCellValue::hasEmptyValue() Line 681 sclo.dll!ScInterpreter::Compare(ScQueryOp eOp) Line 916 sclo.dll!ScInterpreter::ScLess() Line 1214 sclo.dll!ScInterpreter::Interpret() Line 4040 sclo.dll!ScFormulaCell::InterpretTail(ScInterpreterContext & rContext, ScFormulaCell::ScInterpretTailParameter eTailParam) Line 1939 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1632 sclo.dll!ScFormulaCell::MaybeInterpret() Line 446 sclo.dll!ScFormulaCell::IsValue() Line 2745 sclo.dll!`anonymous namespace'::hasNumericImpl(CellType eType, ScFormulaCell * pFormula) Line 155 sclo.dll!ScRefCellValue::hasNumeric() Line 625 sclo.dll!ScInterpreter::FillEntry(ScQueryEntry & rEntry) Line 7484 sclo.dll!ScInterpreter::CalculateLookup(bool bHLookup) Line 7301 sclo.dll!ScInterpreter::ScVLookup() Line 7519 sclo.dll!ScInterpreter::Interpret() Line 4254 sclo.dll!ScFormulaCell::InterpretTail(ScInterpreterContext & rContext, ScFormulaCell::ScInterpretTailParameter eTailParam) Line 1939 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1632 sclo.dll!ScFormulaCell::MaybeInterpret() Line 446 sclo.dll!ScFormulaCell::IsEmpty() Line 2733 sclo.dll!ScRefCellValue::hasEmptyValue() Line 681 sclo.dll!ScInterpreter::Compare(ScQueryOp eOp) Line 916 sclo.dll!ScInterpreter::ScLess() Line 1214 sclo.dll!ScInterpreter::Interpret() Line 4040 sclo.dll!ScFormulaCell::InterpretTail(ScInterpreterContext & rContext, ScFormulaCell::ScInterpretTailParameter eTailParam) Line 1939 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1632 sclo.dll!lcl_InterpretSpan(std::_Vector_const_iterator>> & rSpanIter, long nStartOffset, long nEndOffset, const boost::intrusive_ptr & mxParentGroup, bool & bAllowThreading, ScDocument & rDoc) Line 1669 sclo.dll!lcl_EvalDirty(mdds::multi_type_vector,mdds::mtv::noncopyable_managed_element_block<53,EditTextObject>,mdds::mtv::noncopyable_managed_element_block<54,ScFormulaCell>>,sc::CellStoreEvent> & rCells, long nRow1, long nRow2, ScDocument & rDoc, const boost::intrusive_ptr & mxGroup, bool bThreadingDepEval, bool bSkipRunning, bool & bIsDirty, bool & bAllowThreading) Line 1779 sclo.dll!ScColumn::HandleRefArrayForParallelism(long nRow1, long nRow2, const boost::intrusive_ptr & mxGroup) Line 1854 sclo.dll!ScTable::HandleRefArrayForParallelism(short nCol, long nRow1, long nRow2, const boost::intrusive_ptr & mxGroup) Line 2458 sclo.dll!ScDocument::HandleRefArrayForParallelism(const ScAddress & rPos, long nLength, const boost::intrusive_ptr & mxGroup) Line 1828 sclo.dll!`anonymous namespace'::ScDependantsCalculator::DoIt() Line 4553 sclo.dll!ScFormulaCell::CheckComputeDependencies(sc::FormulaLogger::GroupScope & rScope, bool fromFirstRow, long nStartOffset, long nEndOffset, bool bCalcDependencyOnly) Line 4683 sclo.dll!ScFormulaCell::InterpretFormulaGroupOpenCL(sc::FormulaLogger::GroupScope & aScope, bool & bDependencyComputed, bool & bDependencyCheckFailed) Line 4988 sclo.dll!ScFormulaCell::InterpretFormulaGroup(long nStartOffset, long nEndOffset) Line 4644 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1606 sclo.dll!ScFormulaCell::MaybeInterpret() Line 446 sclo.dll!ScFormulaCell::IsEmpty() Line 2733 sclo.dll!ScRefCellValue::hasEmptyValue() Line 681 sclo.dll!ScInterpreter::PushCellResultToken(bool bDisplayEmptyAsString, const ScAddress & rAddress, SvNumFormatType * pRetTypeExpr, unsigned long * pRetIndexExpr, bool bFinalResult) Line 692 sclo.dll!ScInterpreter::Interpret() Line 4633 sclo.dll!ScFormulaCell::InterpretTail(ScInterpreterContext & rContext, ScFormulaCell::ScInterpretTailParameter eTailParam) Line 1939 sclo.dll!ScFormulaCell::Interpret(long nStartOffset, long nEndOffset) Line 1632 sclo.dll!`anonymous namespace'::DirtyCellInterpreter::operator()(unsigned __int64 __formal, ScFormulaCell * p) Line 104 sclo.dll!sc::EachElem,std::_Vector_iterator>>,mdds::detail::mtv::iterator_value_node,`anonymous namespace'::DirtyCellInterpreter>(mdds::detail::mtv::iterator_value_node & rNode, unsigned __int64 nOffset, unsigned __int64 nDataSize, `anonymous-namespace'::DirtyCellInterpreter & rFuncElem) Line 110 sclo.dll!sc::ProcessElements1,mdds::mtv::noncopyable_managed_element_block<53,EditTextObject>,mdds::mtv::noncopyable_managed_element_block<54,ScFormulaCell>>,sc::CellStoreEvent>,mdds::mtv::noncopyable_managed_element_block<54,ScFormulaCell>,`anonymous namespace'::DirtyCellInterpreter,sc::FuncElseNoOp>(const mdds::detail::mtv::iterator_base,mdds::mtv::noncopyable_managed_element_block<53,EditTextObject>,mdds::mtv::noncopyable_managed_element_block<54,ScFormulaCell>>,sc::CellStoreEvent>::iterator_trait,mdds::detail::mtv::private_data_forward_update>> & itPos, mdds::multi_type_vector,mdds::mtv::noncopyable_managed_element_block<53,EditTextObject>,mdds::mtv::noncopyable_managed_element_block<54,ScFormulaCell>>,sc::CellStoreEvent> & rStore, unsigned __int64 nStart, unsigned __int64 nEnd, `anonymous-namespace'::DirtyCellInterpreter & rFuncElem, sc::FuncElseNoOp & rFuncElse) Line 354 sclo.dll!sc::ProcessFormula<`anonymous namespace'::DirtyCellInterpreter>(const mdds::detail::mtv::iterator_base,mdds::mtv::noncopyable_managed_element_block<53,EditTextObject>,mdds::mtv::noncopyable_managed_element_block<54,ScFormulaCell>>,sc::CellStoreEvent>::iterator_trait,mdds::detail::mtv::private_data_forward_update>> & it, mdds::multi_type_vector,mdds::mtv::noncopyable_managed_element_block<53,EditTextObject>,mdds::mtv::noncopyable_managed_element_block<54,ScFormulaCell>>,sc::CellStoreEvent> & rStore, long nRow1, long nRow2, `anonymous-namespace'::DirtyCellInterpreter & rFuncElem) Line 33 sclo.dll!ScColumn::InterpretDirtyCells(long nRow1, long nRow2) Line 115 sclo.dll!ScTable::InterpretDirtyCells(short nCol1, long nRow1, short nCol2, long nRow2) Line 2504 sclo.dll!ScDocument::InterpretDirtyCells(const ScRangeList & rRanges) Line 3908 sclo.dll!ScMyOLEFixer::CreateChartListener(ScDocument * pDoc, const rtl::OUString & rName, const rtl::OUString & rRangeList) Line 101 sclo.dll!ScMyOLEFixer::FixupOLEs() Line 141 sclo.dll!ScMyTables::FixupOLEs() Line 77 sclo.dll!ScXMLImport::endDocument() Line 1700 expwraplo.dll!sax_fastparser::FastSaxParserImpl::parseStream(const com::sun::star::xml::sax::InputSource & rStructSource) Line 875 expwraplo.dll!sax_fastparser::FastSaxParser::parseStream(const com::sun::star::xml::sax::InputSource & aInputSource) Line 1373 mergedlo.dll!SvXMLImport::parseStream(const com::sun::star::xml::sax::InputSource & aInputSource) Line 488 sclo.dll!ScXMLImportWrapper::ImportFromComponent(const com::sun::star::uno::Reference & xContext, const com::sun::star::uno::Reference & xModel, const com::sun::star::uno::Reference & xParser, com::sun::star::xml::sax::InputSource & aParserInput, const rtl::OUString & sComponentName, const rtl::OUString & sDocName, const rtl::OUString & sOldDocName, const com::sun::star::uno::Sequence & aArgs, bool bMustBeSuccessfull) Line 189 sclo.dll!ScXMLImportWrapper::Import(ImportFlags nMode, ErrCode & rError) Line 513 sclo.dll!ScDocShell::LoadXML(SfxMedium * pLoadMedium, const com::sun::star::uno::Reference & xStor) Line 481 sclo.dll!ScDocShell::Load(SfxMedium & rMedium) Line 628 mergedlo.dll!SfxObjectShell::LoadOwnFormat(SfxMedium & rMedium) Line 3033 mergedlo.dll!SfxObjectShell::DoLoad(SfxMedium * pMed) Line 674 mergedlo.dll!SfxBaseModel::load(const com::sun::star::uno::Sequence & seqArguments) Line 1879 mergedlo.dll!`anonymous namespace'::SfxFrameLoader_Impl::load(const com::sun::star::uno::Sequence & rArgs, const com::sun::star::uno::Reference & _rTargetFrame) Line 680 mergedlo.dll!framework::LoadEnv::impl_loadContent() Line 1157 mergedlo.dll!framework::LoadEnv::start() Line 395 mergedlo.dll!framework::LoadEnv::startLoading(const rtl::OUString & sURL, const com::sun::star::uno::Sequence & lMediaDescriptor, const com::sun::star::uno::Reference & xBaseFrame, const rtl::OUString & sTarget, long nSearchFlags, LoadEnvFeatures eFeature) Line 300 mergedlo.dll!framework::LoadEnv::loadComponentFromURL(const com::sun::star::uno::Reference & xLoader, const com::sun::star::uno::Reference & xContext, const rtl::OUString & sURL, const rtl::OUString & sTarget, long nSearchFlags, const com::sun::star::uno::Sequence & lArgs) Line 169 mergedlo.dll!framework::Desktop::loadComponentFromURL(const rtl::OUString & sURL, const rtl::OUString & sTargetFrameName, long nSearchFlags, const com::sun::star::uno::Sequence & lArguments) Line 613 unotest.dll!unotest::MacrosTest::loadFromDesktop(const rtl::OUString & rURL, const rtl::OUString & rDocService, const com::sun::star::uno::Sequence & rExtraArgs) Line 57 test_sc_uicalc.dll!ScUiCalcTest::createDoc(const char * pName) Line 64 test_sc_uicalc.dll!testTdf124815::TestBody() Line 138 test_sc_uicalc.dll!std::_Invoker_pmf_pointer::_Call(void(testTdf124815::*)() _Pmf, testTdf124815 * & _Arg1) Line 1579 test_sc_uicalc.dll!std::invoke(void(testTdf124815::*)() & _Obj, testTdf124815 * & <_Args_0>) Line 1579 test_sc_uicalc.dll!std::_Invoker_ret::_Call(void(testTdf124815::*)() & <_Vals_0>, testTdf124815 * & <_Vals_1>) Line 1615 test_sc_uicalc.dll!std::_Call_binder,std::tuple<>>(std::_Invoker_ret __formal, std::integer_sequence __formal, void(testTdf124815::*)() & _Obj, std::tuple & _Tpl, std::tuple<> && _Ut) Line 1402 test_sc_uicalc.dll!std::_Binder::operator()<>() Line 1442 test_sc_uicalc.dll!std::_Invoker_functor::_Call &>(std::_Binder & _Obj) Line 1579 test_sc_uicalc.dll!std::invoke &>(std::_Binder & _Obj) Line 1579 test_sc_uicalc.dll!std::_Invoker_ret::_Call &>(std::_Binder & <_Vals_0>) Line 1598 test_sc_uicalc.dll!std::_Func_impl_no_alloc,void>::_Do_call() Line 927 test_sc_uicalc.dll!std::_Func_class::operator()() Line 970 test_sc_uicalc.dll!CppUnit::TestCaller::runTest() Line 176 cppunitd_dll.dll!CppUnit::TestCaseMethodFunctor::operator()() Line 33
vclbootstrapprotector.dll!`anonymous namespace'::Protector::protect(const CppUnit::Functor & functor, const CppUnit::ProtectorContext & __formal) Line 46 cppunitd_dll.dll!CppUnit::ProtectorChain::ProtectFunctor::operator()() Line 21 unobootstrapprotector.dll!`anonymous namespace'::Prot::protect(const CppUnit::Functor & functor, const CppUnit::ProtectorContext & __formal) Line 79 cppunitd_dll.dll!CppUnit::ProtectorChain::ProtectFunctor::operator()() Line 21 unoexceptionprotector.dll!`anonymous namespace'::Prot::protect(const CppUnit::Functor & functor, const CppUnit::ProtectorContext & context) Line 61 cppunitd_dll.dll!CppUnit::ProtectorChain::ProtectFunctor::operator()() Line 21 cppunitd_dll.dll!CppUnit::DefaultProtector::protect(const CppUnit::Functor & functor, const CppUnit::ProtectorContext & context) Line 15 cppunitd_dll.dll!CppUnit::ProtectorChain::ProtectFunctor::operator()() Line 21 cppunitd_dll.dll!CppUnit::ProtectorChain::protect(const CppUnit::Functor & functor, const CppUnit::ProtectorContext & context) Line 86 cppunitd_dll.dll!CppUnit::TestResult::protect(const CppUnit::Functor & functor, CppUnit::Test * test, const std::string & shortDescription) Line 182 cppunitd_dll.dll!CppUnit::TestCase::run(CppUnit::TestResult * result) Line 91 cppunitd_dll.dll!CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult * controller) Line 65 cppunitd_dll.dll!CppUnit::TestComposite::run(CppUnit::TestResult * result) Line 24 cppunitd_dll.dll!CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult * controller) Line 65 cppunitd_dll.dll!CppUnit::TestComposite::run(CppUnit::TestResult * result) Line 24 cppunitd_dll.dll!CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult * result) Line 47 cppunitd_dll.dll!CppUnit::TestResult::runTest(CppUnit::Test * test) Line 150 cppunitd_dll.dll!CppUnit::TestRunner::run(CppUnit::TestResult & controller, const std::string & testPath) Line 96 cppunittester.exe!`anonymous namespace'::ProtectedFixtureFunctor::run() Line 316 cppunittester.exe!sal_main() Line 466 cppunittester.exe!main(int argc, char * * argv) Line 373 cppunittester.exe!invoke_main() Line 79 cppunittester.exe!__scrt_common_main_seh() Line 288 cppunittester.exe!__scrt_common_main() Line 331 cppunittester.exe!mainCRTStartup() Line 17 kernel32.dll!BaseThreadInitThunk() ntdll.dll!RtlUserThreadStart()


It doesn't happen on Linux; opening the test file in Calc succeeds on Windows.

We set stack size of soffice.bin to 10000 in desktop/Executable_soffice_bin.mk; let's do the same for cppunittester, that had the default stack of 1 M [1], which is obviously too small and does not match existing recursion control values in the code (see ScFormulaCell::Interpret).

[1] https://docs.microsoft.com/en-us/windows/win32/procthread/thread-stack-size

Change-Id: I30e6abaea120d6ed5bafb798628e7fc26a8dac59 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90556

bc0ba22e7943 Avoid stack overflow in testTdf124815 on Windows
sal/Executable_cppunittester.mk | 8 ++++++++
1 file changed, 8 insertions(+)

Upstream: cgit.freedesktop.org


  • Share