sw/source/core/layout/tabfrm.cxx | 57 ++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 16 deletions(-)
New commits: commit 68cda6b424723129647108a7f5655fb80c85dad1 Author: Manfred Blume <[email protected]> Date: Thu Jan 25 15:46:57 2018 +0100 tdf#114306 fix crash caused by special document Regression from 18765b9fa739337d2d891513f6e2fb7c3ce23b50 chnage signature of static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom ) to static void lcl_RecalcRow( SwRowFrame* pRow, long nBottom ) Reviewed-on: https://gerrit.libreoffice.org/48613 Tested-by: Jenkins <[email protected]> Reviewed-by: Thorsten Behrens <[email protected]> (cherry picked from commit e4400f4c4e267f8528df3a7d5a09623c888bd10c) Conflicts: sw/source/core/layout/tabfrm.cxx Change-Id: Ie00435aa4bffa3d2e49896aea6894ae999a5536a diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx index c38c11d67d69..c25fa113dbe4 100644 --- a/sw/source/core/layout/tabfrm.cxx +++ b/sw/source/core/layout/tabfrm.cxx @@ -179,7 +179,7 @@ void SwTabFrame::RegistFlys() } void SwInvalidateAll( SwFrame *pFrame, long nBottom ); -static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom ); +static void lcl_RecalcRow( SwRowFrame* pRow, long nBottom ); static bool lcl_ArrangeLowers( SwLayoutFrame *pLay, long lYStart, bool bInva ); // #i26945# - add parameter <_bOnlyRowsAndCells> to control // that only row and cell frames are formatted. @@ -303,7 +303,7 @@ static void lcl_InvalidateLowerObjs( SwLayoutFrame& _rLayoutFrame, } } -// Local helper function to shrink all lowers of rRow to 0 height +// Local helper function to shrink all lowers of pRow to 0 height static void lcl_ShrinkCellsAndAllContent( SwRowFrame& rRow ) { SwCellFrame* pCurrMasterCell = static_cast<SwCellFrame*>(rRow.Lower()); @@ -672,7 +672,7 @@ static bool lcl_RecalcSplitLine( SwRowFrame& rLastLine, SwRowFrame& rFollowLine, } // Do the recalculation - lcl_RecalcRow( rLastLine, LONG_MAX ); + lcl_RecalcRow( &rLastLine, LONG_MAX ); // #115759# - force a format of the last line in order to // get the correct height. rLastLine.InvalidateSize(); @@ -1505,7 +1505,7 @@ static bool lcl_InnerCalcLayout( SwFrame *pFrame, return bRet; } -static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom ) +static void lcl_RecalcRow( SwRowFrame* pRow, long nBottom ) { // FME 2007-08-30 #i81146# new loop control int nLoopControlRuns_1 = 0; @@ -1519,7 +1519,7 @@ static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom ) int nLoopControlRuns_2 = 0; sal_uInt16 nLoopControlStage_2 = 0; - while( lcl_InnerCalcLayout( &rRow, nBottom ) ) + while( lcl_InnerCalcLayout( pRow, nBottom ) ) { if ( ++nLoopControlRuns_2 > nLoopControlMax ) { @@ -1528,7 +1528,7 @@ static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom ) OSL_ENSURE( 1 != nLoopControlStage_2, "LoopControl_2 in lcl_RecalcRow: Stage 2!!" ); OSL_ENSURE( 2 > nLoopControlStage_2, "LoopControl_2 in lcl_RecalcRow: Stage 3!!!" ); #endif - rRow.ValidateThisAndAllLowers( nLoopControlStage_2++ ); + pRow->ValidateThisAndAllLowers( nLoopControlStage_2++ ); nLoopControlRuns_2 = 0; if( nLoopControlStage_2 > 2 ) break; @@ -1541,14 +1541,39 @@ static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom ) { // #115759# - force another format of the // lowers, if at least one of it was invalid. - bCheck = SwContentFrame::CalcLowers( &rRow, rRow.GetUpper(), nBottom, true ); + + // tdf#114306 writer may crash because pRow points to a deleted SwRowFrame + SwRowFrame* pOriginalRow = pRow; + OSL_ENSURE(pOriginalRow->GetUpper() && pOriginalRow->GetUpper()->IsTabFrame(), "No table"); + SwTabFrame* pOriginalTab = static_cast<SwTabFrame*>(pRow->GetUpper()); + + bCheck = SwContentFrame::CalcLowers( pRow, pRow->GetUpper(), nBottom, true ); + + bool bRowStillExists = false; + SwFrame* pTestRow = pOriginalTab->Lower(); + + while (pTestRow) + { + if (pTestRow == pRow) + { + bRowStillExists = true; + break; + } + pTestRow = pTestRow->GetNext(); + } + + if (!bRowStillExists) + { + SAL_WARN("sw.layout", "no row anymore at " << pRow); + return; + } // NEW TABLES // First we calculate the cells with row span of < 1, afterwards // all cells with row span of > 1: for ( int i = 0; i < 2; ++i ) { - SwCellFrame* pCellFrame = static_cast<SwCellFrame*>(rRow.Lower()); + SwCellFrame* pCellFrame = static_cast<SwCellFrame*>(pRow->Lower()); while ( pCellFrame ) { const bool bCalc = 0 == i ? @@ -1576,7 +1601,7 @@ static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom ) OSL_ENSURE( 1 != nLoopControlStage_1, "LoopControl_1 in lcl_RecalcRow: Stage 2!!" ); OSL_ENSURE( 2 > nLoopControlStage_1, "LoopControl_1 in lcl_RecalcRow: Stage 3!!!" ); #endif - rRow.ValidateThisAndAllLowers( nLoopControlStage_1++ ); + pRow->ValidateThisAndAllLowers( nLoopControlStage_1++ ); nLoopControlRuns_1 = 0; if( nLoopControlStage_1 > 2 ) break; @@ -1601,7 +1626,7 @@ static void lcl_RecalcTable( SwTabFrame& rTab, rNotify.SetLowersComplete( true ); } ::SwInvalidatePositions( pFirstRow, LONG_MAX ); - lcl_RecalcRow( static_cast<SwRowFrame&>(*pFirstRow), LONG_MAX ); + lcl_RecalcRow( static_cast<SwRowFrame*>(pFirstRow), LONG_MAX ); } } @@ -2064,7 +2089,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) { ::SwInvalidateAll( pLastLine, LONG_MAX ); SetRebuildLastLine( true ); - lcl_RecalcRow( static_cast<SwRowFrame&>(*pLastLine), LONG_MAX ); + lcl_RecalcRow( static_cast<SwRowFrame*>(pLastLine), LONG_MAX ); SetRebuildLastLine( false ); } @@ -2187,7 +2212,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) } else if (m_bONECalcLowers) { - lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), LONG_MAX ); + lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), LONG_MAX ); m_bONECalcLowers = false; } } @@ -2210,7 +2235,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) } else if (m_bONECalcLowers) { - lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), LONG_MAX ); + lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), LONG_MAX ); m_bONECalcLowers = false; } @@ -2276,7 +2301,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) { SetInRecalcLowerRow( true ); - ::lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), nDeadLine ); + ::lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), nDeadLine ); SetInRecalcLowerRow( false ); } m_bLowersFormatted = true; @@ -2373,7 +2398,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) // to nDeadLine may not be enough. if ( bSplitError && bTryToSplit ) // no restart if we did not try to split: i72847, i79426 { - lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), LONG_MAX ); + lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), LONG_MAX ); mbValidPos = false; bTryToSplit = false; continue; @@ -2414,7 +2439,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) // its content. const bool bOldJoinLock = GetFollow()->IsJoinLocked(); GetFollow()->LockJoin(); - ::lcl_RecalcRow( static_cast<SwRowFrame&>(*GetFollow()->Lower()), + ::lcl_RecalcRow( static_cast<SwRowFrame*>(GetFollow()->Lower()), (GetFollow()->GetUpper()->Frame().*fnRectX->fnGetBottom)() ); // #i43913# // #i63632# Do not unlock the _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
