summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-04-04 20:01:13 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-04-05 12:18:50 +0200
commit8109dd0217cb8d8faac185176d638d7af588a520 (patch)
treec77611cbd6fa7ddf481a2f04b640cdb9c8c66df2
parentb4613a30fed86aa8eed45e1ecee13947a33ea81c (diff)
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@redhat.com>
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx52
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx2
2 files changed, 35 insertions, 19 deletions
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