sw/source/core/undo/rolbck.cxx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
New commits: commit 6d5f215993bf48536f5598133e56ae23e69bd662 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> AuthorDate: Wed Jan 15 07:57:08 2025 -0500 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Jan 21 08:42:48 2025 +0100 sw: safer SwHistoryBookmark::SetInDoc() SIGSEGV code: 1 for address: 0x0 #0 0x00007fdc975f3df8 _ZN17SwHistoryBookmark8SetInDocEP5SwDocb (libswlo.so + 0x9f3df8) #1 0x00007fdc975efe6b _ZN9SwHistory8RollbackEP5SwDoct (libswlo.so + 0x9efe6b) #2 0x00007fdc9760088e _ZN12SwUndoDelete8UndoImplERN2sw15UndoRedoContextE (libswlo.so + 0xa0088e) #3 0x00007fdc97602604 _ZN6SwUndo15UndoWithContextER14SfxUndoContext (libswlo.so + 0xa02604) #4 0x00007fdca41f8789 _ZN14SfxUndoManager8ImplUndoEP14SfxUndoContext (libmergedlo.so + 0x29f8789) Signed-off-by: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Change-Id: Idb31c8815cd582eb15e7db68d0086bea87c2a823 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180455 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/sw/source/core/undo/rolbck.cxx b/sw/source/core/undo/rolbck.cxx index 426be22dcc25..d59ec1a330ba 100644 --- a/sw/source/core/undo/rolbck.cxx +++ b/sw/source/core/undo/rolbck.cxx @@ -643,7 +643,7 @@ void SwHistoryBookmark::SetInDoc( SwDoc* pDoc, bool ) { ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo()); - SwNodes& rNds = pDoc->GetNodes(); + const SwNodes& rNds = pDoc->GetNodes(); IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); std::optional<SwPaM> oPam; ::sw::mark::IMark* pMark = nullptr; @@ -657,15 +657,21 @@ void SwHistoryBookmark::SetInDoc( SwDoc* pDoc, bool ) if(m_bSavePos) { SwContentNode* const pContentNd = rNds[m_nNode]->GetContentNode(); - assert(pContentNd); + assert(pContentNd && "A bookmark position must always be on a content node"); oPam.emplace(*pContentNd, m_nContent); } else { assert(pMark); - oPam.emplace(pMark->GetMarkPos()); + if (pMark != nullptr) + oPam.emplace(pMark->GetMarkPos()); } assert(oPam); + if (!oPam) + { + // Nothing to do without a valid SwPaM. + return; + } if(m_bSaveOtherPos) {