sw/source/core/docnode/ndsect.cxx | 12 ++++++++---- sw/source/core/docnode/ndtbl.cxx | 12 ++++++++---- sw/source/core/docnode/node.cxx | 6 ++++-- sw/source/core/layout/frmtool.cxx | 18 ++++++++++++------ sw/source/core/text/frmform.cxx | 6 ++++-- 5 files changed, 36 insertions(+), 18 deletions(-)
New commits: commit c36da188cc7c9d89c331deb6326f045b6e9f0ad9 Author: Aron Budea <aron.bu...@collabora.com> AuthorDate: Sun Sep 5 03:15:49 2021 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Sun Sep 5 08:28:49 2021 +0200 tdf#144304 Fix crashes from "speedup dynamic_cast to SwTextFrame" Also preemptively adjust cases where FindNextCnt(true) or FindPrevCnt() can be null. Regressions from 426930d0c4bd6f782a04a92e8a36e92cd65e186f. Change-Id: Idb91464ecd285f6f5cf2e399c00faa2dfbbd5601 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121662 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sw/source/core/docnode/ndsect.cxx b/sw/source/core/docnode/ndsect.cxx index ff7946ed3b3b..d5c9db008116 100644 --- a/sw/source/core/docnode/ndsect.cxx +++ b/sw/source/core/docnode/ndsect.cxx @@ -1121,9 +1121,11 @@ void SwSectionNode::MakeFramesForAdjacentContentNode(const SwNodeIndex & rIdx) if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { + auto pNext = pNew->FindNextCnt( true ); + auto pPrev = pNew->FindPrevCnt(); pViewShell->InvalidateAccessibleParaFlowRelation( - pNew->FindNextCnt( true )->DynCastTextFrame(), - pNew->FindPrevCnt()->DynCastTextFrame() ); + pNext ? pNext->DynCastTextFrame() : nullptr, + pPrev ? pPrev->DynCastTextFrame() : nullptr ); } } pNew = pSct; @@ -1147,9 +1149,11 @@ void SwSectionNode::MakeFramesForAdjacentContentNode(const SwNodeIndex & rIdx) if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { + auto pNext = pNew->FindNextCnt( true ); + auto pPrev = pNew->FindPrevCnt(); pViewShell->InvalidateAccessibleParaFlowRelation( - pNew->FindNextCnt( true )->DynCastTextFrame(), - pNew->FindPrevCnt()->DynCastTextFrame() ); + pNext ? pNext->DynCastTextFrame() : nullptr, + pPrev ? pPrev->DynCastTextFrame() : nullptr ); } } if ( bInitNewSect ) diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx index c39676570943..89834dc00e9b 100644 --- a/sw/source/core/docnode/ndtbl.cxx +++ b/sw/source/core/docnode/ndtbl.cxx @@ -2432,9 +2432,11 @@ void SwTableNode::MakeOwnFrames(SwNodeIndex* pIdxBehind) if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { + auto pNext = pNew->FindNextCnt( true ); + auto pPrev = pNew->FindPrevCnt(); pViewShell->InvalidateAccessibleParaFlowRelation( - pNew->FindNextCnt( true )->DynCastTextFrame(), - pNew->FindPrevCnt()->DynCastTextFrame() ); + pNext ? pNext->DynCastTextFrame() : nullptr, + pPrev ? pPrev->DynCastTextFrame() : nullptr ); } } pNew->RegistFlys(); @@ -2467,9 +2469,11 @@ void SwTableNode::DelFrames(SwRootFrame const*const pLayout) if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { + auto pNext = pFrame->FindNextCnt( true ); + auto pPrev = pFrame->FindPrevCnt(); pViewShell->InvalidateAccessibleParaFlowRelation( - pFrame->FindNextCnt( true )->DynCastTextFrame(), - pFrame->FindPrevCnt()->DynCastTextFrame() ); + pNext ? pNext->DynCastTextFrame() : nullptr, + pPrev ? pPrev->DynCastTextFrame() : nullptr ); } } pFrame->Cut(); diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx index d7a2a6ba7116..1e34abfa4b5f 100644 --- a/sw/source/core/docnode/node.cxx +++ b/sw/source/core/docnode/node.cxx @@ -1487,9 +1487,11 @@ void SwContentNode::DelFrames(SwRootFrame const*const pLayout) if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { + auto pNext = pFrame->FindNextCnt( true ); + auto pPrev = pFrame->FindPrevCnt(); pViewShell->InvalidateAccessibleParaFlowRelation( - pFrame->FindNextCnt( true )->DynCastTextFrame(), - pFrame->FindPrevCnt()->DynCastTextFrame() ); + pNext ? pNext->DynCastTextFrame() : nullptr, + pPrev ? pPrev->DynCastTextFrame() : nullptr ); } } diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx index 77293c14d270..7d4eb1f2496c 100644 --- a/sw/source/core/layout/frmtool.cxx +++ b/sw/source/core/layout/frmtool.cxx @@ -1588,9 +1588,11 @@ void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc, pViewShell->GetLayout()->IsAnyShellAccessible() && pFrame->FindPageFrame() != nullptr) { + auto pNext = pFrame->FindNextCnt( true ); + auto pPrev = pFrame->FindPrevCnt(); pViewShell->InvalidateAccessibleParaFlowRelation( - pFrame->FindNextCnt( true )->DynCastTextFrame(), - pFrame->FindPrevCnt()->DynCastTextFrame() ); + pNext ? pNext->DynCastTextFrame() : nullptr, + pPrev ? pPrev->DynCastTextFrame() : nullptr ); // #i68958# // The information flags of the text frame are validated // in methods <FindNextCnt(..)> and <FindPrevCnt(..)>. @@ -1674,9 +1676,11 @@ void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc, pViewShell->GetLayout()->IsAnyShellAccessible() && pFrame->FindPageFrame() != nullptr) { + auto pNext = pFrame->FindNextCnt( true ); + auto pPrev = pFrame->FindPrevCnt(); pViewShell->InvalidateAccessibleParaFlowRelation( - pFrame->FindNextCnt( true )->DynCastTextFrame(), - pFrame->FindPrevCnt()->DynCastTextFrame() ); + pNext ? pNext->DynCastTextFrame() : nullptr, + pPrev ? pPrev->DynCastTextFrame() : nullptr ); } } if ( bObjsDirect && !pTable->empty() ) @@ -1786,9 +1790,11 @@ void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc, pViewShell->GetLayout()->IsAnyShellAccessible() && pFrame->FindPageFrame() != nullptr) { + auto pNext = pFrame->FindNextCnt( true ); + auto pPrev = pFrame->FindPrevCnt(); pViewShell->InvalidateAccessibleParaFlowRelation( - pFrame->FindNextCnt( true )->DynCastTextFrame(), - pFrame->FindPrevCnt()->DynCastTextFrame() ); + pNext ? pNext->DynCastTextFrame() : nullptr, + pPrev ? pPrev->DynCastTextFrame() : nullptr ); } } pFrame->CheckDirChange(); diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx index b0ded2d75306..4731a7d99ebd 100644 --- a/sw/source/core/text/frmform.cxx +++ b/sw/source/core/text/frmform.cxx @@ -668,8 +668,9 @@ SwContentFrame *SwTextFrame::JoinFrame() if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { + auto pNext = pFoll->FindNextCnt( true ); pViewShell->InvalidateAccessibleParaFlowRelation( - pFoll->FindNextCnt( true )->DynCastTextFrame(), + pNext ? pNext->DynCastTextFrame() : nullptr, this ); } } @@ -702,8 +703,9 @@ void SwTextFrame::SplitFrame(TextFrameIndex const nTextPos) if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { + auto pNext = pNew->FindNextCnt( true ); pViewShell->InvalidateAccessibleParaFlowRelation( - pNew->FindNextCnt( true )->DynCastTextFrame(), + pNext ? pNext->DynCastTextFrame() : nullptr, this ); } }