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

Side by Side Diff: components/sync/syncable/model_neutral_mutable_entry.cc

Issue 2844333003: [Sync] Address use-after-free in Directory::InsertEntry (Closed)
Patch Set: Created 3 years, 7 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 unified diff | Download patch
« no previous file with comments | « components/sync/syncable/directory.cc ('k') | components/sync/syncable/mutable_entry.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/sync/syncable/model_neutral_mutable_entry.h" 5 #include "components/sync/syncable/model_neutral_mutable_entry.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility>
8 9
9 #include "components/sync/base/hash_util.h" 10 #include "components/sync/base/hash_util.h"
10 #include "components/sync/base/unique_position.h" 11 #include "components/sync/base/unique_position.h"
11 #include "components/sync/syncable/directory.h" 12 #include "components/sync/syncable/directory.h"
12 #include "components/sync/syncable/scoped_kernel_lock.h" 13 #include "components/sync/syncable/scoped_kernel_lock.h"
13 #include "components/sync/syncable/syncable_changes_version.h" 14 #include "components/sync/syncable/syncable_changes_version.h"
14 #include "components/sync/syncable/syncable_util.h" 15 #include "components/sync/syncable/syncable_util.h"
15 #include "components/sync/syncable/syncable_write_transaction.h" 16 #include "components/sync/syncable/syncable_write_transaction.h"
16 17
17 using std::string; 18 using std::string;
(...skipping 12 matching lines...) Expand all
30 return; // already have an item with this ID. 31 return; // already have an item with this ID.
31 } 32 }
32 std::unique_ptr<EntryKernel> kernel(new EntryKernel()); 33 std::unique_ptr<EntryKernel> kernel(new EntryKernel());
33 34
34 kernel->put(ID, id); 35 kernel->put(ID, id);
35 kernel->put(META_HANDLE, trans->directory()->NextMetahandle()); 36 kernel->put(META_HANDLE, trans->directory()->NextMetahandle());
36 kernel->mark_dirty(&trans->directory()->kernel()->dirty_metahandles); 37 kernel->mark_dirty(&trans->directory()->kernel()->dirty_metahandles);
37 kernel->put(IS_DEL, true); 38 kernel->put(IS_DEL, true);
38 // We match the database defaults here 39 // We match the database defaults here
39 kernel->put(BASE_VERSION, CHANGES_VERSION); 40 kernel->put(BASE_VERSION, CHANGES_VERSION);
40 if (!trans->directory()->InsertEntry(trans, kernel.get())) { 41 kernel_ = kernel.get();
42 if (!trans->directory()->InsertEntry(trans, std::move(kernel))) {
43 kernel_ = nullptr;
41 return; // Failed inserting. 44 return; // Failed inserting.
42 } 45 }
43 trans->TrackChangesTo(kernel.get()); 46 trans->TrackChangesTo(kernel_);
44
45 kernel_ = kernel.release();
46 } 47 }
47 48
48 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans, 49 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans,
49 CreateNewTypeRoot, 50 CreateNewTypeRoot,
50 ModelType type) 51 ModelType type)
51 : Entry(trans), base_write_transaction_(trans) { 52 : Entry(trans), base_write_transaction_(trans) {
52 // We allow NIGORI because we allow SyncEncryptionHandler to restore a nigori 53 // We allow NIGORI because we allow SyncEncryptionHandler to restore a nigori
53 // across Directory instances (see SyncEncryptionHandler::RestoreNigori). 54 // across Directory instances (see SyncEncryptionHandler::RestoreNigori).
54 if (type != NIGORI) 55 if (type != NIGORI)
55 DCHECK(IsTypeWithClientGeneratedRoot(type)); 56 DCHECK(IsTypeWithClientGeneratedRoot(type));
(...skipping 11 matching lines...) Expand all
67 68
68 kernel->put(ID, 69 kernel->put(ID,
69 syncable::Id::CreateFromClientString(ModelTypeToString(type))); 70 syncable::Id::CreateFromClientString(ModelTypeToString(type)));
70 kernel->put(META_HANDLE, trans->directory()->NextMetahandle()); 71 kernel->put(META_HANDLE, trans->directory()->NextMetahandle());
71 kernel->put(PARENT_ID, syncable::Id::GetRoot()); 72 kernel->put(PARENT_ID, syncable::Id::GetRoot());
72 kernel->put(BASE_VERSION, CHANGES_VERSION); 73 kernel->put(BASE_VERSION, CHANGES_VERSION);
73 kernel->put(NON_UNIQUE_NAME, ModelTypeToString(type)); 74 kernel->put(NON_UNIQUE_NAME, ModelTypeToString(type));
74 kernel->put(IS_DIR, true); 75 kernel->put(IS_DIR, true);
75 76
76 kernel->mark_dirty(&trans->directory()->kernel()->dirty_metahandles); 77 kernel->mark_dirty(&trans->directory()->kernel()->dirty_metahandles);
78 kernel_ = kernel.get();
77 79
78 if (!trans->directory()->InsertEntry(trans, kernel.get())) { 80 if (!trans->directory()->InsertEntry(trans, std::move(kernel))) {
81 kernel_ = nullptr;
79 return; // Failed inserting. 82 return; // Failed inserting.
80 } 83 }
81 84 trans->TrackChangesTo(kernel_);
82 trans->TrackChangesTo(kernel.get());
83
84 kernel_ = kernel.release();
85 } 85 }
86 86
87 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans, 87 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans,
88 GetById, 88 GetById,
89 const Id& id) 89 const Id& id)
90 : Entry(trans, GET_BY_ID, id), base_write_transaction_(trans) {} 90 : Entry(trans, GET_BY_ID, id), base_write_transaction_(trans) {}
91 91
92 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans, 92 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans,
93 GetByHandle, 93 GetByHandle,
94 int64_t metahandle) 94 int64_t metahandle)
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans) 453 ModelNeutralMutableEntry::ModelNeutralMutableEntry(BaseWriteTransaction* trans)
454 : Entry(trans), base_write_transaction_(trans) {} 454 : Entry(trans), base_write_transaction_(trans) {}
455 455
456 void ModelNeutralMutableEntry::MarkDirty() { 456 void ModelNeutralMutableEntry::MarkDirty() {
457 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles); 457 kernel_->mark_dirty(&dir()->kernel()->dirty_metahandles);
458 } 458 }
459 459
460 } // namespace syncable 460 } // namespace syncable
461 461
462 } // namespace syncer 462 } // namespace syncer
OLDNEW
« no previous file with comments | « components/sync/syncable/directory.cc ('k') | components/sync/syncable/mutable_entry.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698