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

Unified Diff: components/safe_browsing_db/v4_local_database_manager_unittest.cc

Issue 2427863002: Small: Use a weak pointer for callbacks to V4LocalDatabaseManager (Closed)
Patch Set: WaitForTasksOnTaskRunner at the end of the test to ensure that the scheduled tasks get run. Created 4 years, 2 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
« no previous file with comments | « components/safe_browsing_db/v4_local_database_manager.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/safe_browsing_db/v4_local_database_manager_unittest.cc
diff --git a/components/safe_browsing_db/v4_local_database_manager_unittest.cc b/components/safe_browsing_db/v4_local_database_manager_unittest.cc
index 61ca2bb8801102e40425704295e0d71d4980062e..b6659f4b1decfd8d2b8f4cebcf515536894f1ceb 100644
--- a/components/safe_browsing_db/v4_local_database_manager_unittest.cc
+++ b/components/safe_browsing_db/v4_local_database_manager_unittest.cc
@@ -172,11 +172,12 @@ class V4LocalDatabaseManagerTest : public PlatformTest {
}
void StopLocalDatabaseManager() {
- v4_local_database_manager_->StopOnIOThread(true);
+ if (v4_local_database_manager_) {
+ v4_local_database_manager_->StopOnIOThread(true);
+ }
// Force destruction of the database.
- task_runner_->RunPendingTasks();
- base::RunLoop().RunUntilIdle();
+ WaitForTasksOnTaskRunner();
}
void WaitForTasksOnTaskRunner() {
@@ -332,4 +333,34 @@ TEST_F(V4LocalDatabaseManagerTest, PerformFullHashCheckCalledAsync) {
v4_local_database_manager_));
}
+TEST_F(V4LocalDatabaseManagerTest, UsingWeakPtrDropsCallback) {
+ // StopLocalDatabaseManager before resetting it because that's what
+ // ~V4LocalDatabaseManager expects.
+ StopLocalDatabaseManager();
+ v4_local_database_manager_ =
+ make_scoped_refptr(new FakeV4LocalDatabaseManager(base_dir_.GetPath()));
+ SetTaskRunnerForTest();
+ StartLocalDatabaseManager();
+ WaitForTasksOnTaskRunner();
+ net::TestURLFetcherFactory factory;
+
+ StoreAndHashPrefixes store_and_hash_prefixes;
+ store_and_hash_prefixes.emplace_back(GetUrlMalwareId(), HashPrefix("aaaa"));
+ ReplaceV4Database(store_and_hash_prefixes);
+
+ // The fake database returns a matched hash prefix.
+ EXPECT_FALSE(v4_local_database_manager_->CheckBrowseUrl(
+ GURL("http://example.com/a/"), nullptr));
+ v4_local_database_manager_->StopOnIOThread(true);
+
+ // Release the V4LocalDatabaseManager object right away before the callback
+ // gets called. When the callback gets called, without using a weak-ptr
+ // factory, this leads to a use after free. However, using the weak-ptr means
+ // that the callback is simply dropped.
+ v4_local_database_manager_ = nullptr;
+
+ // Wait for the tasks scheduled by StopOnIOThread to complete.
+ WaitForTasksOnTaskRunner();
+}
+
} // namespace safe_browsing
« no previous file with comments | « components/safe_browsing_db/v4_local_database_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698