[PATCH libreoffice-4-1] fix fdo#64872 infinite loop saving as doc

Luke Deller (via Code Review) gerrit at gerrit.libreoffice.org
Fri May 24 08:07:29 PDT 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/4028

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/28/4028/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 5a367cd..617faf4 100644
--- a/sw/source/filter/xml/xmltbli.cxx
+++ b/sw/source/filter/xml/xmltbli.cxx
@@ -1804,29 +1804,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/4028
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-1
Gerrit-Owner: Luke Deller <luke at deller.id.au>



More information about the LibreOffice mailing list