Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(783)

Unified Diff: chrome/browser/sync/syncable/syncable.cc

Issue 3026029: Fix EntryKernel leak if sync database load fails (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Fix legit leak in PurgeEntriesWithTypeIn Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync/syncable/syncable.cc
diff --git a/chrome/browser/sync/syncable/syncable.cc b/chrome/browser/sync/syncable/syncable.cc
index a2a9a98599b010e7d22b69e29ff1c8fd54a41fc4..cf193797c1c62d79e8aed72907a12ceb8590c58e 100644
--- a/chrome/browser/sync/syncable/syncable.cc
+++ b/chrome/browser/sync/syncable/syncable.cc
@@ -32,6 +32,7 @@
#include "base/perftimer.h"
#include "base/scoped_ptr.h"
#include "base/string_util.h"
+#include "base/stl_util-inl.h"
#include "base/time.h"
#include "chrome/browser/sync/engine/syncer.h"
#include "chrome/browser/sync/engine/syncer_util.h"
@@ -183,10 +184,6 @@ Directory::Kernel::Kernel(const FilePath& db_path,
next_metahandle(info.max_metahandle + 1) {
}
-inline void DeleteEntry(EntryKernel* kernel) {
- delete kernel;
-}
-
void Directory::Kernel::AddRef() {
base::subtle::NoBarrier_AtomicIncrement(&refcount, 1);
}
@@ -207,7 +204,7 @@ Directory::Kernel::~Kernel() {
delete parent_id_child_index;
delete client_tag_index;
delete ids_index;
- for_each(metahandles_index->begin(), metahandles_index->end(), DeleteEntry);
+ STLDeleteElements(metahandles_index);
delete metahandles_index;
}
@@ -339,7 +336,7 @@ EntryKernel* Directory::GetEntryByHandle(const int64 metahandle,
// Look up in memory
kernel_->needle.put(META_HANDLE, metahandle);
MetahandlesIndex::iterator found =
- kernel_->metahandles_index->find(&kernel_->needle);
+ kernel_->metahandles_index->find(&kernel_->needle);
if (found != kernel_->metahandles_index->end()) {
// Found it in memory. Easy.
return *found;
@@ -630,17 +627,19 @@ void Directory::PurgeEntriesWithTypeIn(const std::set<ModelType>& types) {
kernel_->metahandles_to_purge->insert(handle);
size_t num_erased = 0;
- num_erased = kernel_->ids_index->erase(*it);
+ EntryKernel* entry = *it;
+ num_erased = kernel_->ids_index->erase(entry);
DCHECK_EQ(1u, num_erased);
- num_erased = kernel_->client_tag_index->erase(*it);
- DCHECK_EQ((*it)->ref(UNIQUE_CLIENT_TAG).empty(), !num_erased);
+ num_erased = kernel_->client_tag_index->erase(entry);
+ DCHECK_EQ(entry->ref(UNIQUE_CLIENT_TAG).empty(), !num_erased);
num_erased = kernel_->unsynced_metahandles->erase(handle);
- DCHECK_EQ((*it)->ref(IS_UNSYNCED), num_erased > 0);
+ DCHECK_EQ(entry->ref(IS_UNSYNCED), num_erased > 0);
num_erased = kernel_->unapplied_update_metahandles->erase(handle);
- DCHECK_EQ((*it)->ref(IS_UNAPPLIED_UPDATE), num_erased > 0);
- num_erased = kernel_->parent_id_child_index->erase(*it);
- DCHECK_EQ((*it)->ref(IS_DEL), !num_erased);
+ DCHECK_EQ(entry->ref(IS_UNAPPLIED_UPDATE), num_erased > 0);
+ num_erased = kernel_->parent_id_child_index->erase(entry);
+ DCHECK_EQ(entry->ref(IS_DEL), !num_erased);
kernel_->metahandles_index->erase(it++);
+ delete entry;
} else {
++it;
}

Powered by Google App Engine
This is Rietveld 408576698