kbrown / rpms / libreoffice

Forked from rpms/libreoffice 2 years ago
Clone
Blob Blame History Raw
From 1d33b1de2b9eeef0043c057bbfa539ab1e7c3238 Mon Sep 17 00:00:00 2001
From: Kohei Yoshida <kohei.yoshida@collabora.com>
Date: Fri, 6 Dec 2013 19:44:21 -0500
Subject: [PATCH 046/109] fdo#66984: Define an assignment operator to prevent
 double deletion.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The code path was assigning one ScDPObject to another via assignment,
but we didn't define one. So we were using the compiler generated
assignment which only shallow-copies data members, which ultimately
caused double-deletion of one of its data members.

Change-Id: Ie98d0789e51aebff683dbcc0e533a9a0a87943d5
(cherry picked from commit bd976e5b070ec68a4f842190db4d0c1ea0e93428)
Reviewed-on: https://gerrit.libreoffice.org/6966
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
---
 sc/inc/dpobject.hxx              |  3 +++
 sc/source/core/data/dpobject.cxx | 49 +++++++++++++++++++++++++++++++++++-----
 2 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/sc/inc/dpobject.hxx b/sc/inc/dpobject.hxx
index 8505a53..06d4957 100644
--- a/sc/inc/dpobject.hxx
+++ b/sc/inc/dpobject.hxx
@@ -118,11 +118,14 @@ public:
     ScDPObject(const ScDPObject& r);
     ~ScDPObject();
 
+    ScDPObject& operator= (const ScDPObject& r);
+
     void EnableGetPivotData(bool b);
 
     void                SetAllowMove(bool bSet);
 
     void                InvalidateData();
+    void Clear();
     void ClearTableData();
     void ReloadGroupTableData();
 
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx
index 677ccd5..169231a 100644
--- a/sc/source/core/data/dpobject.cxx
+++ b/sc/source/core/data/dpobject.cxx
@@ -354,12 +354,34 @@ ScDPObject::ScDPObject(const ScDPObject& r) :
 
 ScDPObject::~ScDPObject()
 {
-    delete pOutput;
-    delete pSaveData;
-    delete pSheetDesc;
-    delete pImpDesc;
-    delete pServDesc;
-    ClearTableData();
+    Clear();
+}
+
+ScDPObject& ScDPObject::operator= (const ScDPObject& r)
+{
+    Clear();
+
+    pDoc = r.pDoc;
+    aTableName = r.aTableName;
+    aTableTag = r.aTableTag;
+    aOutRange = r.aOutRange;
+    mnAutoFormatIndex = r.mnAutoFormatIndex;
+    nHeaderRows = r.nHeaderRows;
+    mbHeaderLayout = r.mbHeaderLayout;
+    bAllowMove = false;
+    bSettingsChanged = false;
+    mbEnableGetPivotData = r.mbEnableGetPivotData;
+
+    if (r.pSaveData)
+        pSaveData = new ScDPSaveData(*r.pSaveData);
+    if (r.pSheetDesc)
+        pSheetDesc = new ScSheetSourceDesc(*r.pSheetDesc);
+    if (r.pImpDesc)
+        pImpDesc = new ScImportSourceDesc(*r.pImpDesc);
+    if (r.pServDesc)
+        pServDesc = new ScDPServiceDesc(*r.pServDesc);
+
+    return *this;
 }
 
 void ScDPObject::EnableGetPivotData(bool b)
@@ -780,6 +802,21 @@ void ScDPObject::InvalidateData()
     bSettingsChanged = true;
 }
 
+void ScDPObject::Clear()
+{
+    delete pOutput;
+    delete pSaveData;
+    delete pSheetDesc;
+    delete pImpDesc;
+    delete pServDesc;
+    pOutput = NULL;
+    pSaveData = NULL;
+    pSheetDesc = NULL;
+    pImpDesc = NULL;
+    pServDesc = NULL;
+    ClearTableData();
+}
+
 void ScDPObject::ClearTableData()
 {
     ClearSource();
-- 
1.8.4.2