sw/source/core/unocore/unofield.cxx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
New commits: commit ad387d5b984c6666906505d25685065f710ed55d Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Jun 27 21:29:11 2022 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Sun Dec 18 23:08:05 2022 +0000 crashtesting: failure on load of forum-en-7529.odt ==324198== Invalid read of size 8 ==324198== at 0x2D840D75: std::__uniq_ptr_impl<SwField, std::default_delete<SwField> >::_M_ptr() const (unique_ptr.h:191) ==324198== by 0x2D840D54: std::unique_ptr<SwField, std::default_delete<SwField> >::get() const (unique_ptr.h:462) ==324198== by 0x2D932B9B: SwFormatField::GetField() (fmtfld.hxx:122) ==324198== by 0x2E740E7B: SwXTextField::Impl::GetField() const (unofield.cxx:2634) ==324198== by 0x2E7487EB: SwXTextField::setPropertyValue(rtl::OUString const&, com::sun::star::uno::Any const&) (unofield.cxx:2150) ==324198== by 0x1100C123: XMLPropertyBackpatcher<short>::ResolveId(rtl::OUString const&, short) (XMLPropertyBackpatcher.cxx:73) ==324198== by 0x1100BB0F: XMLTextImportHelper::InsertFootnoteID(rtl::OUString const&, short) (XMLPropertyBackpatcher.cxx:180) ==324198== by 0x10FF7E71: XMLFootnoteImportContext::startFastElement(int, com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> const&) (XMLFootnoteImportContext.cxx:99) ==324198== by 0x10C40361: SvXMLImport::startFastElement(int, com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> const&) (xmlimp.cxx:812) ==324198== by 0x28FBFE71: (anonymous namespace)::Entity::startElement((anonymous namespace)::Event const*) (fastparser.cxx:470) ==324198== by 0x28FBED4E: sax_fastparser::FastSaxParserImpl::callbackStartElement(unsigned char const*, unsigned char const*, unsigned char const*, int, unsigned char const**, int, unsigned char const**) (fastparser.cxx:1304) ==324198== by 0x28FBCCAF: (anonymous namespace)::call_callbackStartElement(void*, unsigned char const*, unsigned char const*, unsigned char const*, int, unsigned char const**, int, int, unsigned char const**) (fastparser.cxx:333) ==324198== Address 0x259e2b68 is 328 bytes inside a block of size 344 free'd ==324198== at 0x4848669: operator delete(void*) (vg_replace_malloc.c:923) ==324198== by 0x2E4EC2B1: SwFormatField::~SwFormatField() (atrfld.cxx:132) ==324198== by 0x8635DA2: SfxItemPool::Remove(SfxPoolItem const&) (itempool.cxx:802) ==324198== by 0x2E5BB014: SwTextAttr::Destroy(SwTextAttr*, SfxItemPool&) (txatbase.cxx:63) ==324198== by 0x2E594EE2: SwTextNode::DestroyAttr(SwTextAttr*) (thints.cxx:1302) ==324198== by 0x2E55C4EC: SwTextNode::~SwTextNode() (ndtxt.cxx:238) ==324198== by 0x2E55CB38: SwTextNode::~SwTextNode() (ndtxt.cxx:227) ==324198== by 0x2DEE048F: SwNodes::RemoveNode(o3tl::strong_int<int, Tag_SwNodeOffset>, o3tl::strong_int<int, Tag_SwNodeOffset>, bool) (nodes.cxx:2325) ==324198== by 0x2DEE50C2: SwNodes::DelNodes(SwNodeIndex const&, o3tl::strong_int<int, Tag_SwNodeOffset>) (nodes.cxx:1384) ==324198== by 0x2DC87B02: sw::DocumentContentOperationsManager::DeleteSection(SwNode*) (DocumentContentOperationsManager.cxx:2118) ==324198== by 0x2DD2BB66: sw::DocumentLayoutManager::DelLayoutFormat(SwFrameFormat*) (DocumentLayoutManager.cxx:285) ==324198== by 0x2DB0900E: DelFlyInRange(SwNodeIndex const&, SwNodeIndex const&, SwIndex const*, SwIndex const*) (docedt.cxx:254) maybe this is a problem since the various changes associated with: commit 2c9298e4f667a5dd7606d79890fcedfff0f66e26 Date: Fri Apr 5 23:14:47 2019 +0200 SwXTextField::Impl FieldTypeClient: SwClient no more commit e18359445fabad9ba1a704600e9ee327112cc6ae Date: Sun Apr 14 13:33:35 2019 +0200 [API CHANGE] SwXTextField: no more SwModify/SwClient Change-Id: I52aa0a70604ea5ce96d2b55a9a2ad363a889f58e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136515 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/sw/source/core/unocore/unofield.cxx b/sw/source/core/unocore/unofield.cxx index 0e20949b3ced..84ae8fe2d8f5 100644 --- a/sw/source/core/unocore/unofield.cxx +++ b/sw/source/core/unocore/unofield.cxx @@ -1967,6 +1967,7 @@ void SAL_CALL SwXTextField::attach( if (!pTextAttr) throw uno::RuntimeException("no SwTextAttr inserted?"); // could theoretically happen, if paragraph is full + m_pImpl->ClearFieldType(); const SwFormatField& rField = pTextAttr->GetFormatField(); m_pImpl->SetFormatField(const_cast<SwFormatField*>(&rField), pDoc); @@ -1990,7 +1991,6 @@ void SAL_CALL SwXTextField::attach( m_pImpl->GetFormatField()->SetXTextField(this); m_pImpl->m_wThis = this; m_pImpl->m_bIsDescriptor = false; - m_pImpl->ClearFieldType(); m_pImpl->m_pProps.reset(); if (m_pImpl->m_bCallUpdate) update(); commit 487e1d73393ae9e6fe7961c8a95dd77a3598b510 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Sun Dec 18 21:12:24 2022 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Sun Dec 18 23:07:52 2022 +0000 crashtesting: related to failure on load of forum-en-7529.odt save SwDoc* before calling DeleteAndJoin, so SetFormatField doesn't use m_pImpl->m_pDoc potentially cleared by it Change-Id: Ia130f224fcccd35e1dfafbbaf5c461c9bd032f9d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144407 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/sw/source/core/unocore/unofield.cxx b/sw/source/core/unocore/unofield.cxx index 36bf1cae1c8d..0e20949b3ced 100644 --- a/sw/source/core/unocore/unofield.cxx +++ b/sw/source/core/unocore/unofield.cxx @@ -1999,7 +1999,8 @@ void SAL_CALL SwXTextField::attach( && m_pImpl->m_pDoc != nullptr && m_pImpl->m_nServiceId == SwServiceType::FieldTypeAnnotation ) { - SwUnoInternalPaM aIntPam( *m_pImpl->m_pDoc ); + SwDoc* pDoc = m_pImpl->m_pDoc; + SwUnoInternalPaM aIntPam( *pDoc ); if ( !::sw::XTextRangeToSwPaM( aIntPam, xTextRange ) ) throw lang::IllegalArgumentException(); @@ -2007,13 +2008,13 @@ void SAL_CALL SwXTextField::attach( // value. if (!aIntPam.HasMark() || *aIntPam.Start() != *aIntPam.End()) { - UnoActionContext aCont( m_pImpl->m_pDoc ); + UnoActionContext aCont( pDoc ); // insert copy of annotation at new text range std::unique_ptr<SwPostItField> pPostItField(static_cast< SwPostItField* >(m_pImpl->GetFormatField()->GetField()->CopyField().release())); SwFormatField aFormatField( *pPostItField ); pPostItField.reset(); SwPaM aEnd( *aIntPam.End(), *aIntPam.End() ); - m_pImpl->m_pDoc->getIDocumentContentOperations().InsertPoolItem( aEnd, aFormatField ); + pDoc->getIDocumentContentOperations().InsertPoolItem( aEnd, aFormatField ); // delete former annotation { const SwTextField* pTextField = m_pImpl->GetFormatField()->GetTextField(); @@ -2021,14 +2022,14 @@ void SAL_CALL SwXTextField::attach( SwPaM aPam( rTextNode, pTextField->GetStart() ); aPam.SetMark(); aPam.Move(); - m_pImpl->m_pDoc->getIDocumentContentOperations().DeleteAndJoin(aPam); + pDoc->getIDocumentContentOperations().DeleteAndJoin(aPam); } // keep inserted annotation { SwTextField *const pTextAttr = aEnd.GetPointNode().GetTextNode()->GetFieldTextAttrAt(aEnd.End()->GetContentIndex()-1, ::sw::GetTextAttrMode::Default); if ( pTextAttr != nullptr ) { - m_pImpl->SetFormatField(const_cast<SwFormatField*>(&pTextAttr->GetFormatField()), m_pImpl->m_pDoc); + m_pImpl->SetFormatField(const_cast<SwFormatField*>(&pTextAttr->GetFormatField()), pDoc); if ( *aIntPam.GetPoint() != *aIntPam.GetMark() ) {