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

Side by Side Diff: chrome/browser/safe_browsing/safe_browsing_database.cc

Issue 10093004: Double-check safe-browsing database validity on update failure. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Check size before reading. Created 8 years, 8 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 | « no previous file | chrome/browser/safe_browsing/safe_browsing_store.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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/safe_browsing/safe_browsing_database.h" 5 #include "chrome/browser/safe_browsing/safe_browsing_database.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <iterator> 8 #include <iterator>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 1083 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 download_whitelist_listnames, lists); 1094 download_whitelist_listnames, lists);
1095 } 1095 }
1096 1096
1097 corruption_detected_ = false; 1097 corruption_detected_ = false;
1098 change_detected_ = false; 1098 change_detected_ = false;
1099 return true; 1099 return true;
1100 } 1100 }
1101 1101
1102 void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) { 1102 void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) {
1103 DCHECK_EQ(creation_loop_, MessageLoop::current()); 1103 DCHECK_EQ(creation_loop_, MessageLoop::current());
1104
1105 // The update may have failed due to corrupt storage (for instance,
1106 // an excessive number of invalid add_chunks and sub_chunks).
1107 // Double-check that the databases are valid.
1108 // TODO(shess): Providing a checksum for the add_chunk and sub_chunk
1109 // sections would allow throwing a corruption error in
1110 // UpdateStarted().
1111 if (!update_succeeded) {
1112 if (!browse_store_->CheckValidity())
1113 DLOG(ERROR) << "Safe-browsing browse database corrupt.";
1114
1115 if (download_store_.get() && !download_store_->CheckValidity())
1116 DLOG(ERROR) << "Safe-browsing download database corrupt.";
1117
1118 if (csd_whitelist_store_.get() && !csd_whitelist_store_->CheckValidity())
1119 DLOG(ERROR) << "Safe-browsing csd whitelist database corrupt.";
1120
1121 if (download_whitelist_store_.get() &&
1122 !download_whitelist_store_->CheckValidity()) {
1123 DLOG(ERROR) << "Safe-browsing download whitelist database corrupt.";
1124 }
1125 }
1126
1104 if (corruption_detected_) 1127 if (corruption_detected_)
1105 return; 1128 return;
1106 1129
1107 // Unroll the transaction if there was a protocol error or if the 1130 // Unroll the transaction if there was a protocol error or if the
1108 // transaction was empty. This will leave the bloom filter, the 1131 // transaction was empty. This will leave the bloom filter, the
1109 // pending hashes, and the prefix miss cache in place. 1132 // pending hashes, and the prefix miss cache in place.
1110 if (!update_succeeded || !change_detected_) { 1133 if (!update_succeeded || !change_detected_) {
1111 // Track empty updates to answer questions at http://crbug.com/72216 . 1134 // Track empty updates to answer questions at http://crbug.com/72216 .
1112 if (update_succeeded && !change_detected_) 1135 if (update_succeeded && !change_detected_)
1113 UMA_HISTOGRAM_COUNTS("SB2.DatabaseUpdateKilobytes", 0); 1136 UMA_HISTOGRAM_COUNTS("SB2.DatabaseUpdateKilobytes", 0);
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
1318 MessageLoop::current()->PostTask(FROM_HERE, 1341 MessageLoop::current()->PostTask(FROM_HERE,
1319 base::Bind(&SafeBrowsingDatabaseNew::OnHandleCorruptDatabase, 1342 base::Bind(&SafeBrowsingDatabaseNew::OnHandleCorruptDatabase,
1320 reset_factory_.GetWeakPtr())); 1343 reset_factory_.GetWeakPtr()));
1321 } 1344 }
1322 } 1345 }
1323 1346
1324 void SafeBrowsingDatabaseNew::OnHandleCorruptDatabase() { 1347 void SafeBrowsingDatabaseNew::OnHandleCorruptDatabase() {
1325 RecordFailure(FAILURE_DATABASE_CORRUPT_HANDLER); 1348 RecordFailure(FAILURE_DATABASE_CORRUPT_HANDLER);
1326 corruption_detected_ = true; // Stop updating the database. 1349 corruption_detected_ = true; // Stop updating the database.
1327 ResetDatabase(); 1350 ResetDatabase();
1328 DCHECK(false) << "SafeBrowsing database was corrupt and reset"; 1351 DLOG(FATAL) << "SafeBrowsing database was corrupt and reset";
1329 } 1352 }
1330 1353
1331 // TODO(shess): I'm not clear why this code doesn't have any 1354 // TODO(shess): I'm not clear why this code doesn't have any
1332 // real error-handling. 1355 // real error-handling.
1333 void SafeBrowsingDatabaseNew::LoadBloomFilter() { 1356 void SafeBrowsingDatabaseNew::LoadBloomFilter() {
1334 DCHECK_EQ(creation_loop_, MessageLoop::current()); 1357 DCHECK_EQ(creation_loop_, MessageLoop::current());
1335 DCHECK(!bloom_filter_filename_.empty()); 1358 DCHECK(!bloom_filter_filename_.empty());
1336 1359
1337 // If we're missing either of the database or filter files, we wait until the 1360 // If we're missing either of the database or filter files, we wait until the
1338 // next update to generate a new filter. 1361 // next update to generate a new filter.
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1438 if (std::binary_search(new_whitelist.begin(), new_whitelist.end(), 1461 if (std::binary_search(new_whitelist.begin(), new_whitelist.end(),
1439 kill_switch)) { 1462 kill_switch)) {
1440 // The kill switch is whitelisted hence we whitelist all URLs. 1463 // The kill switch is whitelisted hence we whitelist all URLs.
1441 WhitelistEverything(whitelist); 1464 WhitelistEverything(whitelist);
1442 } else { 1465 } else {
1443 base::AutoLock locked(lookup_lock_); 1466 base::AutoLock locked(lookup_lock_);
1444 whitelist->second = false; 1467 whitelist->second = false;
1445 whitelist->first.swap(new_whitelist); 1468 whitelist->first.swap(new_whitelist);
1446 } 1469 }
1447 } 1470 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/safe_browsing/safe_browsing_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698