[Libreoffice-commits] .: 2 commits - editeng/source sw/inc sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Tue Sep 18 05:50:06 PDT 2012


 editeng/source/editeng/editeng.cxx |    2 +-
 sw/inc/swtable.hxx                 |    1 +
 sw/source/core/table/swtable.cxx   |   14 +++++++++++---
 sw/source/core/undo/untbl.cxx      |    5 +++++
 4 files changed, 18 insertions(+), 4 deletions(-)

New commits:
commit c7692ae82b4c81c2ea8a9e3ee496ee525c0d44f4
Author: Michael Stahl <mst at openoffice.org>
Date:   Tue Sep 18 14:32:48 2012 +0200

    typo
    
    Change-Id: Ibf3dd31f2c213dca83a03773c430de841d2511de

diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx
index d3fb0c3..258e8a5 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -159,7 +159,7 @@ void EditEngine::UndoActionStart(sal_uInt16 nId, const ESelection& rSel)
 void EditEngine::UndoActionEnd( sal_uInt16 nId )
 {
     DBG_CHKTHIS( EditEngine, 0 );
-    DBG_ASSERT( !pImpEditEngine->IsInUndo(), "Calling UndoActionStart in Undomode!" );
+    DBG_ASSERT( !pImpEditEngine->IsInUndo(), "Calling UndoActionEnd in Undomode!" );
     if ( !pImpEditEngine->IsInUndo() )
         pImpEditEngine->UndoActionEnd( nId );
 }
commit cf842d7c7f9559bfdbb3924cd05a3a50d1dff5e3
Author: Michael Stahl <mst at openoffice.org>
Date:   Tue Sep 18 14:19:50 2012 +0200

    rhbz#852128: sw: avoid table undo crash:
    
    SwUndoTblNdsChg::UndoImpl: to prevent access of deleted table box start
    node, disconnect the SwTableBox from the start node before removing the
    table box nodes.
    This problem was probably introduced with CWS swnewtable
    db4de0817df6906db2743239d45f9f0834ab1e91, which changed the order of the
    removal operations for unknown reasons.
    
    Change-Id: Ic59823a84082cc6ff453b2b512cbb8253886ecf3

diff --git a/sw/inc/swtable.hxx b/sw/inc/swtable.hxx
index 600da7d..0a887c6 100644
--- a/sw/inc/swtable.hxx
+++ b/sw/inc/swtable.hxx
@@ -431,6 +431,7 @@ public:
     SwFrmFmt* ClaimFrmFmt();
     void ChgFrmFmt( SwTableBoxFmt *pNewFmt );
 
+    void RemoveFromTable();
     const SwStartNode *GetSttNd() const { return pSttNd; }
     sal_uLong GetSttIdx() const;
 
diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx
index 5ea5db3..5784ada 100644
--- a/sw/source/core/table/swtable.cxx
+++ b/sw/source/core/table/swtable.cxx
@@ -1724,10 +1724,9 @@ SwTableBox::SwTableBox( SwTableBoxFmt* pFmt, const SwStartNode& rSttNd, SwTableL
     rSrtArr.insert( p );        // insert
 }
 
-SwTableBox::~SwTableBox()
+void SwTableBox::RemoveFromTable()
 {
-    // box containing contents?
-    if( !GetFrmFmt()->GetDoc()->IsInDtor() && pSttNd )
+    if (pSttNd) // box containing contents?
     {
         // remove from table
         const SwTableNode* pTblNd = pSttNd->FindTableNode();
@@ -1736,6 +1735,15 @@ SwTableBox::~SwTableBox()
                                     GetTabSortBoxes();
         SwTableBox *p = this;   // error: &this
         rSrtArr.erase( p );        // remove
+        pSttNd = 0; // clear it so this is only run once
+    }
+}
+
+SwTableBox::~SwTableBox()
+{
+    if (!GetFrmFmt()->GetDoc()->IsInDtor())
+    {
+        RemoveFromTable();
     }
 
     // the TabelleBox can be deleted if it's the last client of the FrameFormat
diff --git a/sw/source/core/undo/untbl.cxx b/sw/source/core/undo/untbl.cxx
index 27e3983..e5e4f0b 100644
--- a/sw/source/core/undo/untbl.cxx
+++ b/sw/source/core/undo/untbl.cxx
@@ -1758,7 +1758,11 @@ void SwUndoTblNdsChg::UndoImpl(::sw::UndoRedoContext & rContext)
                 rDoc.GetNodes()._MoveNodes( aRg, rDoc.GetNodes(), aInsPos, sal_False );
             }
             else
+            {   // first disconnect box from node, otherwise ~SwTableBox would
+                // access pBox->pSttNd, deleted by DeleteSection
+                pBox->RemoveFromTable();
                 rDoc.DeleteSection( rDoc.GetNodes()[ nIdx ] );
+            }
             aDelBoxes.insert( aDelBoxes.end(), pBox );
         }
     }
@@ -1774,6 +1778,7 @@ void SwUndoTblNdsChg::UndoImpl(::sw::UndoRedoContext & rContext)
             // TL_CHART2: notify chart about box to be removed
             if (pPCD)
                 pPCD->DeleteBox( &pTblNd->GetTable(), *pBox );
+            pBox->RemoveFromTable(); // ~SwTableBox would access pBox->pSttNd
             aDelBoxes.insert( aDelBoxes.end(), pBox );
             rDoc.DeleteSection( rDoc.GetNodes()[ nIdx ] );
         }


More information about the Libreoffice-commits mailing list