You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2012/06/29 11:04:32 UTC

svn commit: r1355277 - /incubator/ooo/trunk/main/sc/source/ui/unoobj/cellsuno.cxx

Author: alg
Date: Fri Jun 29 09:04:31 2012
New Revision: 1355277

URL: http://svn.apache.org/viewvc?rev=1355277&view=rev
Log:
#120105# Avoid MemoryLeak in ScTableSheetObj::PrintAreaUndo_Impl by handling created ScPrintRageSaver objects more careful.
Found by: Chao Huang
Patch by: Chao Huang, alg
Review by: alg

Modified:
    incubator/ooo/trunk/main/sc/source/ui/unoobj/cellsuno.cxx

Modified: incubator/ooo/trunk/main/sc/source/ui/unoobj/cellsuno.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/ui/unoobj/cellsuno.cxx?rev=1355277&r1=1355276&r2=1355277&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/ui/unoobj/cellsuno.cxx (original)
+++ incubator/ooo/trunk/main/sc/source/ui/unoobj/cellsuno.cxx Fri Jun 29 09:04:31 2012
@@ -7365,31 +7365,43 @@ void SAL_CALL ScTableSheetObj::copyRange
 void ScTableSheetObj::PrintAreaUndo_Impl( ScPrintRangeSaver* pOldRanges )
 {
 	//	Umbrueche und Undo
-
 	ScDocShell* pDocSh = GetDocShell();
-	if ( pDocSh )
+	ScDocument* pDoc = pDocSh ? pDocSh->GetDocument() : 0;
+
+    if(pDocSh && pDoc)
 	{
-		ScDocument* pDoc = pDocSh->GetDocument();
-		sal_Bool bUndo(pDoc->IsUndoEnabled());
-		SCTAB nTab = GetTab_Impl();
+		const bool bUndo(pDoc->IsUndoEnabled());
+		const SCTAB nTab(GetTab_Impl());
 
-		ScPrintRangeSaver* pNewRanges = pDoc->CreatePrintRangeSaver();
-		if (bUndo)
+		if(bUndo)
 		{
-			pDocSh->GetUndoManager()->AddUndoAction(
-						new ScUndoPrintRange( pDocSh, nTab, pOldRanges, pNewRanges ) );
-		}
+            pDocSh->GetUndoManager()->AddUndoAction(
+			    new ScUndoPrintRange( 
+                    pDocSh, 
+                    nTab, 
+                    pOldRanges,
+                    pDoc->CreatePrintRangeSaver())); // create new ranges
 
-		ScPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ).UpdatePages();
+            // #120105# ownership of old ranges has changed, mark as consumed
+            pOldRanges = 0;
+		}
 
+		ScPrintFunc(pDocSh, pDocSh->GetPrinter(), nTab).UpdatePages();
 		SfxBindings* pBindings = pDocSh->GetViewBindings();
-		if (pBindings)
-			pBindings->Invalidate( SID_DELETE_PRINTAREA );
+
+        if(pBindings)
+        {
+			pBindings->Invalidate(SID_DELETE_PRINTAREA);
+        }
 
 		pDocSh->SetDocumentModified();
 	}
-	else
+
+    if(pOldRanges)
+    {
+        // #120105# pOldRanges not used, need to cleanup
 		delete pOldRanges;
+    }
 }
 
 uno::Sequence<table::CellRangeAddress> SAL_CALL ScTableSheetObj::getPrintAreas()