summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kyoshida@novell.com>2011-07-19 14:46:50 -0400
committerPetr Mladek <pmladek@suse.cz>2011-07-25 17:22:55 +0200
commite64d3793a10cf6d253384308db3de671a8b4a922 (patch)
treedff1c1741d09e65341096f4beffc1b155ba50b1c
parent4117039d868d897cbb71201c0bb075c7ffe52e8a (diff)
fdo#39236: Prevent double-deletes during removal of pivot tables.
In short, don't use erase remove(_if) idiom to remove objects from boost ptr containers which would cause double deletes because of the way remove-like algorithms work. STL's remove-like algorithms create duplicates of the elements instead of re-ordering them by design, and this obviously doesn't work well with containers containing pointers. IMPORTANT: this will get a better incremental fix Signed-off-by: David Tardon <dtardon@redhat.com> Signed-off-by: Petr Mladek <pmladek@suse.cz> Signed-off-by: Michael Meeks <michael.meeks@novell.com> Signed-off-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r--sc/source/core/data/dpobject.cxx33
1 files changed, 9 insertions, 24 deletions
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx
index eda6c16baa2e..9d7eae9608cd 100644
--- a/sc/source/core/data/dpobject.cxx
+++ b/sc/source/core/data/dpobject.cxx
@@ -83,8 +83,6 @@
using namespace com::sun::star;
using ::std::vector;
-using ::std::unary_function;
-using ::std::remove_if;
using ::boost::shared_ptr;
using ::com::sun::star::uno::Sequence;
using ::com::sun::star::uno::Reference;
@@ -2556,25 +2554,6 @@ ScDPCollection::~ScDPCollection()
maTables.clear();
}
-namespace {
-
-/**
- * Unary predicate to match DP objects by the table ID.
- */
-class MatchByTable : public unary_function<bool, ScDPObject>
-{
- SCTAB mnTab;
-public:
- MatchByTable(SCTAB nTab) : mnTab(nTab) {}
-
- bool operator() (const ScDPObject& rObj) const
- {
- return rObj.GetOutRange().aStart.Tab() == mnTab;
- }
-};
-
-}
-
bool ScDPCollection::ClearCache(ScDPObject* pDPObj)
{
if (pDPObj->IsSheetData())
@@ -2612,9 +2591,15 @@ bool ScDPCollection::ClearCache(ScDPObject* pDPObj)
void ScDPCollection::DeleteOnTab( SCTAB nTab )
{
- maTables.erase(
- remove_if(maTables.begin(), maTables.end(), MatchByTable(nTab)),
- maTables.end());
+ TablesType aNewTables;
+ while (!maTables.empty())
+ {
+ TablesType::auto_type xDP = maTables.pop_back();
+ if (xDP->GetOutRange().aStart.Tab() != nTab)
+ // Not on this sheet. Keep it.
+ aNewTables.push_back(xDP.release());
+ }
+ maTables.swap(aNewTables);
}
void ScDPCollection::UpdateReference( UpdateRefMode eUpdateRefMode,