sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

New commits:
commit 5d678aa14046041efef1e025fcc1c064e2d59efd
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Thu Feb 6 08:35:33 2025 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Fri Feb 7 16:12:21 2025 +0100

    writerfilter: fix crash in DomainMapperTableHandler::endTable()
    
    Crashreport signature:
    
    /opt/rh/devtoolset-12/root/usr/include/c++/12/bits/stl_stack.h:234: 
std::stack<_Tp, _Sequence>::reference std::stack<_Tp, _Sequence>::top() [with 
_Tp = writerfilter::dmapper::TextAppendContext; _Sequence = 
std::deque<writerfilter::dmapper::TextAppendContext, 
std::allocator<writerfilter::dmapper::TextAppendContext> >; reference = 
writerfilter::dmapper::TextAppendContext&]: Assertion '!this->empty()' failed.
    
    SIG   Fatal signal received: SIGABRT code: 18446744073709551610 for 
address: 0x7300004d65
    
    program/libwriterfilterlo.so
          writerfilter::dmapper::DomainMapper_Impl::GetTopTextAppend()
                  
/opt/rh/devtoolset-12/root/usr/include/c++/12/bits/stl_stack.h:234
    program/libwriterfilterlo.so
          writerfilter::dmapper::DomainMapperTableHandler::endTable(unsigned 
int)
                  
workdir/UnoApiHeadersTarget/offapi/normal/com/sun/star/text/XTextAppendAndConvert.hpp:23
    program/libwriterfilterlo.so
          writerfilter::dmapper::TableManager::resolveCurrentTable()
                  include/tools/ref.hxx:56
    program/libwriterfilterlo.so
          writerfilter::dmapper::TableManager::endLevel()
                  writerfilter/source/dmapper/TableManager.cxx:461
    
    It seems the trouble is that DomainMapperTableHandler::endTable() calls
    GetTopTextAppend() unconditionally, which asserts that the text append
    stack is non-empty. GetCurrentXText() already check if this stack is
    empty, so use that to check for emptyness and only then get the top of
    the stack. Later DomainMapperTableHandler::endTable() already checks if
    xTextAppendAndConvert is an empty reference or not.
    
    Change-Id: Ibb377cb03f8beaed9b3c9d45e322c8ad1f9d26c3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181231
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    (cherry picked from commit 7192e3e5d6f875e4e9d2eda6de9e1f31c4917f62)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181242
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx 
b/sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx
index 6c2a72ddeb9e..4962794c0c40 100644
--- a/sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx
+++ b/sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx
@@ -1661,7 +1661,11 @@ void DomainMapperTableHandler::endTable(unsigned int 
nestedTableLevel)
             sal_Int32 nTableWidthType = text::SizeType::FIX;
             m_aTableProperties->getValue(TablePropertyMap::TABLE_WIDTH_TYPE, 
nTableWidthType);
             // m_xText points to the body text, get the current xText from 
m_rDMapper_Impl, in case e.g. we would be in a header.
-            uno::Reference<text::XTextAppendAndConvert> 
xTextAppendAndConvert(m_rDMapper_Impl.GetTopTextAppend(), uno::UNO_QUERY);
+            uno::Reference<text::XTextAppendAndConvert> xTextAppendAndConvert;
+            if (m_rDMapper_Impl.GetCurrentXText())
+            {
+                xTextAppendAndConvert.set(m_rDMapper_Impl.GetTopTextAppend(), 
uno::UNO_QUERY);
+            }
             uno::Reference<beans::XPropertySet> xFrameAnchor;
 
             // Writer layout has problems with redlines on floating table rows 
in footnotes, avoid

Reply via email to