diff options
author | Michael Stahl <michael.stahl@allotropia.de> | 2022-05-20 15:46:20 +0200 |
---|---|---|
committer | Michael Stahl <michael.stahl@allotropia.de> | 2022-08-23 18:10:24 +0200 |
commit | 197f973f9b614e30e9a02d6edcc9c6578fba8724 (patch) | |
tree | ad7029faabccb625acb23cfd6a7524bdab7381a9 | |
parent | e710fa2a9141f2d3464bc08c2dbc739e6b0e044d (diff) |
sw_redlinehide: fix crash in IsMarkHidden() if pointing to table node
This is called during mail merge from documentStartPageNumber()
and if the document starts with a table, the passed UNO mark will point
to SwTableNode.
(regression from commit 943d9be770e550d20ca72274fa5e914d1f61e605)
Change-Id: Ic69c12ba0d819eda85de5dde95e35a8071466c2e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134692
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
(cherry picked from commit 4d3b750d08d05c475fb38f8b3961696d9cc9882f)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134776
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 9b7670155553115b967bb2a9215a4ee49f7b0ef2)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136180
Tested-by: Michael Stahl <michael.stahl@allotropia.de>
-rw-r--r-- | sw/source/core/crsr/crbm.cxx | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/sw/source/core/crsr/crbm.cxx b/sw/source/core/crsr/crbm.cxx index a9175808de85..b35b1329cbca 100644 --- a/sw/source/core/crsr/crbm.cxx +++ b/sw/source/core/crsr/crbm.cxx @@ -130,9 +130,14 @@ bool IsMarkHidden(SwRootFrame const& rLayout, ::sw::mark::IMark const& rMark) { return false; } - SwTextNode const& rNode(*rMark.GetMarkPos().nNode.GetNode().GetTextNode()); + SwNode const& rNode(rMark.GetMarkPos().nNode.GetNode()); + SwTextNode const*const pTextNode(rNode.GetTextNode()); + if (pTextNode == nullptr) + { // UNO_BOOKMARK may point to table node + return rNode.GetRedlineMergeFlag() == SwNode::Merge::Hidden; + } SwTextFrame const*const pFrame(static_cast<SwTextFrame const*>( - rNode.getLayoutFrame(&rLayout))); + pTextNode->getLayoutFrame(&rLayout))); if (!pFrame) { return true; @@ -147,14 +152,14 @@ bool IsMarkHidden(SwRootFrame const& rLayout, ::sw::mark::IMark const& rMark) } else { - if (rMark.GetMarkPos().nContent.GetIndex() == rNode.Len()) + if (rMark.GetMarkPos().nContent.GetIndex() == pTextNode->Len()) { // at end of node: never deleted (except if node deleted) - return rNode.GetRedlineMergeFlag() == SwNode::Merge::Hidden; + return pTextNode->GetRedlineMergeFlag() == SwNode::Merge::Hidden; } else { // check character following mark pos return pFrame->MapModelToViewPos(rMark.GetMarkPos()) - == pFrame->MapModelToView(&rNode, rMark.GetMarkPos().nContent.GetIndex() + 1); + == pFrame->MapModelToView(pTextNode, rMark.GetMarkPos().nContent.GetIndex() + 1); } } } |