diff options
author | Luke Deller <luke@deller.id.au> | 2013-05-23 02:05:36 +1000 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2013-05-27 12:46:25 +0000 |
commit | e94c8521041259d36aaadcadb9e42ca729a3812b (patch) | |
tree | bf2fdb15c038fb0becaf92ff7ba9acc4e555568e /sw | |
parent | 4c831dd9e53163d75073c627c774f59fdaf9e874 (diff) |
fix fdo#64872 infinite loop saving as doc
When loading from odt, table cells which are covered (due to merging of
cells) are replaced with an empty cell by
SwXMLTableContext::ReplaceWithEmptyCell. However if there is a sequence
of cells covered from above then their replacements are accidentally
inserted in reverse order, which produces this infinite loop problem when
saving as doc.
The reverse ordering in SwXMLTableContext::ReplaceWithEmptyCell was because
the insert position came from SwXMLTableContext::GetPrevStartNode which was
very careful to skip previous covered cells. However those cells have
already been replaced with an empty cell so they should not be skipped.
Change-Id: I6a022cd1490afa181dbc3e4b2d6ed4af3077b363
Reviewed-on: https://gerrit.libreoffice.org/4008
Reviewed-by: David Tardon <dtardon@redhat.com>
Tested-by: David Tardon <dtardon@redhat.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/filter/xml/xmltbli.cxx | 26 |
1 files changed, 6 insertions, 20 deletions
diff --git a/sw/source/filter/xml/xmltbli.cxx b/sw/source/filter/xml/xmltbli.cxx index 9cc801f5f2f8..e0a214f52992 100644 --- a/sw/source/filter/xml/xmltbli.cxx +++ b/sw/source/filter/xml/xmltbli.cxx @@ -1804,29 +1804,15 @@ const SwStartNode *SwXMLTableContext::GetPrevStartNode( sal_uInt32 nRow, // The last cell is the right one here. pPrevCell = GetCell( pRows->size()-1U, GetColumnCount()-1UL ); } - else if( 0UL == nRow ) + else if( nCol > 0UL ) { - // There are no vertically merged cells within the first row, so the - // previous cell is the right one always. - if( nCol > 0UL ) - pPrevCell = GetCell( nRow, nCol-1UL ); + // The previous cell in this row. + pPrevCell = GetCell( nRow, nCol-1UL ); } - else + else if( nRow > 0UL ) { - // If there is a previous cell in the current row that is not spanned - // from the previous row, its the right one. - const SwXMLTableRow_Impl *pPrevRow = &(*pRows)[(sal_uInt16)nRow-1U]; - sal_uInt32 i = nCol; - while( !pPrevCell && i > 0UL ) - { - i--; - if( 1UL == pPrevRow->GetCell( i )->GetRowSpan() ) - pPrevCell = GetCell( nRow, i ); - } - - // Otherwise, the last cell from the previous row is the right one. - if( !pPrevCell ) - pPrevCell = pPrevRow->GetCell( GetColumnCount()-1UL ); + // The last cell from the previous row. + pPrevCell = GetCell( nRow-1UL, GetColumnCount()-1UL ); } const SwStartNode *pSttNd = 0; |