summaryrefslogtreecommitdiff
path: root/sw/source/core/doc/docbm.cxx
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2022-10-27 15:38:28 +0200
committerMiklos Vajna <vmiklos@collabora.com>2022-10-27 16:31:35 +0200
commitbd892f3ba96fae1f0a151734053da0b39ca69c86 (patch)
treec4c83fd58a9039ffffb7ccc085b124f4b3df8ba9 /sw/source/core/doc/docbm.cxx
parentb9ec72ff4d2fb89002ab81e363712fbfd4cbfd98 (diff)
crashtesting: fix PDF export of tdf98567-1.docx
Importing tdf98567-1.docx crashed with debug STL since commit 47bc36c0f87ec2d0329260bcb98d62c7667a5dd1 (sw: make sure mark container is sorted before calling equal_range(), 2022-10-24). The problem is that sw::mark::MarkManager::deleteMark() calls DeregisterFromDoc(), which can call selection change listeners, which may mutate the container. Fix the problem by delaying the DeregisterFromDoc call using an ILazyDeleter for DDE bookmarks. Change-Id: Ia4e8ec379dc0c597db8fe5d91d55af09363350c4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141907 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'sw/source/core/doc/docbm.cxx')
-rw-r--r--sw/source/core/doc/docbm.cxx31
1 files changed, 16 insertions, 15 deletions
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index 6db0b5b51862..3243a79c55ff 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -1219,6 +1219,21 @@ namespace sw::mark
}
};
+ struct LazyDdeBookmarkDeleter : public IDocumentMarkAccess::ILazyDeleter
+ {
+ std::unique_ptr<DdeBookmark> m_pDdeBookmark;
+ SwDoc& m_rDoc;
+ LazyDdeBookmarkDeleter(DdeBookmark *const pDdeBookmark, SwDoc& rDoc)
+ : m_pDdeBookmark(pDdeBookmark), m_rDoc(rDoc)
+ {
+ assert(pDdeBookmark);
+ }
+ virtual ~LazyDdeBookmarkDeleter() override
+ {
+ m_pDdeBookmark->DeregisterFromDoc(m_rDoc);
+ }
+ };
+
}
std::unique_ptr<IDocumentMarkAccess::ILazyDeleter>
@@ -1292,21 +1307,7 @@ namespace sw::mark
DdeBookmark* const pDdeBookmark = dynamic_cast<DdeBookmark*>(pMark);
if (pDdeBookmark)
{
- pDdeBookmark->DeregisterFromDoc(m_rDoc);
-
- // Update aI, possibly a selection listener invalidated the iterators of m_vAllMarks.
- assureSortedMarkContainers();
- auto [it, endIt] = equal_range(m_vAllMarks.begin(), m_vAllMarks.end(),
- pMark->GetMarkStart(), CompareIMarkStartsBefore());
- for (; it != endIt; ++it)
- {
- if (*it == pMark)
- {
- aI = m_vAllMarks.begin();
- std::advance(aI, std::distance<container_t::const_iterator>(aI, it));
- break;
- }
- }
+ ret.reset(new LazyDdeBookmarkDeleter(dynamic_cast<DdeBookmark*>(pMark), m_rDoc));
}
m_vAllMarks.erase(aI);