[Libreoffice-commits] core.git: writerfilter/source
Caolán McNamara (via logerrit)
logerrit at kemper.freedesktop.org
Mon Apr 5 10:19:33 UTC 2021
writerfilter/source/dmapper/DomainMapper_Impl.cxx | 52 +++++++++++++---------
writerfilter/source/dmapper/DomainMapper_Impl.hxx | 2
2 files changed, 35 insertions(+), 19 deletions(-)
New commits:
commit 8109dd0217cb8d8faac185176d638d7af588a520
Author: Caolán McNamara <caolanm at redhat.com>
AuthorDate: Sun Apr 4 20:01:13 2021 +0100
Commit: Caolán McNamara <caolanm at redhat.com>
CommitDate: Mon Apr 5 12:18:50 2021 +0200
crashtesting: assert in fdo6872-1.docx in CopyImplImpl after SAXError exception
sw/source/core/doc/DocumentContentOperationsManager.cxx:5040
assert(pStt->nNode != pEnd->nNode);
presumably due to the error the positions are wrong when CopyImplImpl is
called in popping the context where the exception occured, so skip the
asserting operation if the document failed to load and will be thrown away
fixes fdo68738-1.docx, fdo46060-6.docx, fdo55725-1.docx, fdo68721-1.docx
but similar ooo127821-1.docx remains
Change-Id: I09aca7a6884f7806c74797466522bb489260da51
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113572
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 44ab9fdf3b36..200cb75667be 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -20,6 +20,7 @@
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/document/XDocumentProperties.hpp>
+#include <com/sun/star/xml/sax/SAXException.hpp>
#include <ooxml/resourceids.hxx>
#include "DomainMapper_Impl.hxx"
#include "ConversionHelper.hxx"
@@ -354,7 +355,8 @@ DomainMapper_Impl::DomainMapper_Impl(
m_bParaAutoBefore(false),
m_bFirstParagraphInCell(true),
m_bSaveFirstParagraphInCell(false),
- m_bParaWithInlineObject(false)
+ m_bParaWithInlineObject(false),
+ m_bSaxError(false)
{
m_aBaseUrl = rMediaDesc.getUnpackedValueOrDefault(
@@ -2973,23 +2975,26 @@ void DomainMapper_Impl::PopFootOrEndnote()
xFootnotes->getByIndex(1) >>= xFootnoteFirst;
else
xEndnotes->getByIndex(1) >>= xFootnoteFirst;
- uno::Reference< text::XText > xSrc( xFootnoteFirst, uno::UNO_QUERY_THROW );
- uno::Reference< text::XText > xDest( xFootnoteLast, uno::UNO_QUERY_THROW );
- uno::Reference< text::XTextCopy > xTxt, xTxt2;
- xTxt.set( xSrc, uno::UNO_QUERY_THROW );
- xTxt2.set( xDest, uno::UNO_QUERY_THROW );
- xTxt2->copyText( xTxt );
-
- // copy its redlines
- std::vector<sal_Int32> redPos, redLen;
- sal_Int32 redIdx;
- enum StoredRedlines eType = IsInFootnote() ? StoredRedlines::FOOTNOTE : StoredRedlines::ENDNOTE;
- lcl_CopyRedlines(xSrc, m_aStoredRedlines[eType], redPos, redLen, redIdx);
- lcl_PasteRedlines(xDest, m_aStoredRedlines[eType], redPos, redLen, redIdx);
-
- // remove processed redlines
- for( size_t i = 0; redIdx > -1 && i <= sal::static_int_cast<size_t>(redIdx) + 2; i++)
- m_aStoredRedlines[eType].pop_front();
+ if (!m_bSaxError)
+ {
+ uno::Reference< text::XText > xSrc( xFootnoteFirst, uno::UNO_QUERY_THROW );
+ uno::Reference< text::XText > xDest( xFootnoteLast, uno::UNO_QUERY_THROW );
+ uno::Reference< text::XTextCopy > xTxt, xTxt2;
+ xTxt.set( xSrc, uno::UNO_QUERY_THROW );
+ xTxt2.set( xDest, uno::UNO_QUERY_THROW );
+ xTxt2->copyText( xTxt );
+
+ // copy its redlines
+ std::vector<sal_Int32> redPos, redLen;
+ sal_Int32 redIdx;
+ enum StoredRedlines eType = IsInFootnote() ? StoredRedlines::FOOTNOTE : StoredRedlines::ENDNOTE;
+ lcl_CopyRedlines(xSrc, m_aStoredRedlines[eType], redPos, redLen, redIdx);
+ lcl_PasteRedlines(xDest, m_aStoredRedlines[eType], redPos, redLen, redIdx);
+
+ // remove processed redlines
+ for( size_t i = 0; redIdx > -1 && i <= sal::static_int_cast<size_t>(redIdx) + 2; i++)
+ m_aStoredRedlines[eType].pop_front();
+ }
// remove temporary footnote
xFootnoteFirst->getAnchor()->setString("");
@@ -7640,7 +7645,16 @@ void DomainMapper_Impl::substream(Id rName,
PushAnnotation();
break;
}
- ref->resolve(m_rDMapper);
+
+ try
+ {
+ ref->resolve(m_rDMapper);
+ }
+ catch (xml::sax::SAXException const&)
+ {
+ m_bSaxError = true;
+ throw;
+ }
switch( rName )
{
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 1b29e96cbc27..c4d9b5014c04 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -1144,6 +1144,8 @@ private:
bool m_bSaveFirstParagraphInCell;
/// Current paragraph had at least one inline object in it.
bool m_bParaWithInlineObject;
+ /// SAXException was seen so document will be abandoned
+ bool m_bSaxError;
};
} //namespace writerfilter::dmapper
More information about the Libreoffice-commits
mailing list