diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-12-06 19:44:21 -0500 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-12-07 18:39:08 +0000 |
commit | 1d33b1de2b9eeef0043c057bbfa539ab1e7c3238 (patch) | |
tree | f3094a79e950c1386445881e81350b88a0c7f3ca /sc | |
parent | b0a18ae31de70fbd44bf9677ff0f9d01aad5588f (diff) |
fdo#66984: Define an assignment operator to prevent double deletion.
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>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/dpobject.hxx | 3 | ||||
-rw-r--r-- | 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 8505a535da2e..06d49571e467 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 677ccd526364..169231a8bb1a 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(); |