summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2017-12-15 17:07:01 +0100
committerMichael Stahl <mstahl@redhat.com>2017-12-15 17:39:23 +0100
commitb77881366b17230908f441dfa27afcafc4374708 (patch)
tree0b244650049026640a97f09d331ada2264890fdb
parentaa07f2892e581dd31f1b8861499e29c96dddbac0 (diff)
tdf#100635 sw: fix layout crash caused by field expansion ...
... triggering recursive layout-in-layout where a SwTextFrame that's being formatted is deleted inside some other frame's SwTextNode::GetFormatted(). The offending field is a SwAuthorityField that's located in a fly-frame with FLY_AT_PAGE anchor. SwPageFrame::GetContentPosition() is only called by field expansion code, so this shouldn't have an effect on layout. It already has a fall-back for the case when the frame has invalid flags, so handle the situation when the SwLineLayout has been deleted from the SwCache due to overflow the same way, which prevents the recursive formatting. Change-Id: I90437edb5692dc2bdec7ad03964588942bde05be
-rw-r--r--sw/source/core/layout/trvlfrm.cxx5
1 files changed, 4 insertions, 1 deletions
diff --git a/sw/source/core/layout/trvlfrm.cxx b/sw/source/core/layout/trvlfrm.cxx
index df410a56ceb2..dfaa27bf2a03 100644
--- a/sw/source/core/layout/trvlfrm.cxx
+++ b/sw/source/core/layout/trvlfrm.cxx
@@ -1433,9 +1433,12 @@ void SwPageFrame::GetContentPosition( const Point &rPt, SwPosition &rPos ) const
else if ( aAct.X() > aRect.Right() )
aAct.X() = aRect.Right();
- if( !pAct->isFrameAreaDefinitionValid() )
+ if (!pAct->isFrameAreaDefinitionValid() ||
+ (pAct->IsTextFrame() && !static_cast<SwTextFrame const*>(pAct)->HasPara()))
{
// ContentFrame not formatted -> always on node-beginning
+ // tdf#100635 also if the SwTextFrame would require reformatting,
+ // which is unwanted in case this is called from text formatting code
SwContentNode* pCNd = const_cast<SwContentNode*>(pAct->GetNode());
OSL_ENSURE( pCNd, "Where is my ContentNode?" );
rPos.nNode = *pCNd;