Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/4026
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/26/4026/1
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
---
M sw/source/filter/xml/xmltbli.cxx
1 file changed, 6 insertions(+), 20 deletions(-)
diff --git a/sw/source/filter/xml/xmltbli.cxx b/sw/source/filter/xml/xmltbli.cxx
index 6cd2cdc..50d5e99 100644
--- a/sw/source/filter/xml/xmltbli.cxx
+++ b/sw/source/filter/xml/xmltbli.cxx
@@ -1807,29 +1807,15 @@
// 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;
--
To view, visit https://gerrit.libreoffice.org/4026
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a022cd1490afa181dbc3e4b2d6ed4af3077b363
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Luke Deller <luke@deller.id.au>
Context
- [PATCH libreoffice-4-0] fix fdo#64872 infinite loop saving as doc · Luke Deller (via Code Review)
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.