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

Unified Diff: chrome/browser/safe_browsing/safe_browsing_database.cc

Issue 6286072: PrefixSet as an alternate to BloomFilter for safe-browsing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Example of how a specific set would be stored. Created 9 years, 10 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 | « chrome/browser/safe_browsing/safe_browsing_database.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/safe_browsing/safe_browsing_database.cc
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.cc b/chrome/browser/safe_browsing/safe_browsing_database.cc
index e7176552732d0cf2d1dd9d6a60c36715307fbc2c..a8ad3c0a67aa15f0c733de3c5a12d0d9c04dc7cd 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_database.cc
@@ -12,6 +12,7 @@
#include "base/process_util.h"
#include "base/sha2.h"
#include "chrome/browser/safe_browsing/bloom_filter.h"
+#include "chrome/browser/safe_browsing/prefix_set.h"
#include "chrome/browser/safe_browsing/safe_browsing_store_file.h"
#include "chrome/browser/safe_browsing/safe_browsing_store_sqlite.h"
#include "chrome/browser/safe_browsing/safe_browsing_util.h"
@@ -179,6 +180,37 @@ bool SBAddFullHashPrefixLess(const SBAddFullHash& a, const SBAddFullHash& b) {
return a.full_hash.prefix < b.full_hash.prefix;
}
+// Create a |PrefixSet| from a vector of add-prefixes.
+safe_browsing::PrefixSet* CreatePrefixSet(
+ const std::vector<SBAddPrefix>& add_prefixes) {
+ std::vector<SBPrefix> prefixes;
+ for (size_t i = 0; i < add_prefixes.size(); ++i) {
+ prefixes.push_back(add_prefixes[i].prefix);
+ }
+ return new safe_browsing::PrefixSet(prefixes);
+}
+
+// As compared to the bloom filter, PrefixSet should have these
+// properties:
+// - Any bloom filter miss should be a prefix set miss.
+// - Any prefix set hit should be a bloom filter hit.
+// - Bloom filter false positives are prefix set misses.
+// The following is to log actual performance to verify this.
+enum PrefixSetEvent {
+ PREFIX_SET_EVENT_HIT,
+ PREFIX_SET_EVENT_BLOOM_HIT,
+ PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT,
+
+ // Memory space for histograms is determined by the max. ALWAYS ADD
+ // NEW VALUES BEFORE THIS ONE.
+ PREFIX_SET_EVENT_MAX
+};
+
+void RecordPrefixSetInfo(PrefixSetEvent event_type) {
+ UMA_HISTOGRAM_ENUMERATION("SB2.PrefixSetEvent", event_type,
+ PREFIX_SET_EVENT_MAX);
+}
+
} // namespace
// The default SafeBrowsingDatabaseFactory.
@@ -331,6 +363,9 @@ bool SafeBrowsingDatabaseNew::ResetDatabase() {
// TODO(shess): This could probably be |bloom_filter_.reset()|.
browse_bloom_filter_ = new BloomFilter(BloomFilter::kBloomFilterMinSize *
BloomFilter::kBloomFilterSizeRatio);
+ // TODO(shess): It is simpler for the code to assume that presence
+ // of a bloom filter always implies presence of a prefix set.
+ prefix_set_.reset(CreatePrefixSet(std::vector<SBAddPrefix>()));
}
return true;
@@ -359,13 +394,24 @@ bool SafeBrowsingDatabaseNew::ContainsBrowseUrl(
if (!browse_bloom_filter_.get())
return false;
+ DCHECK(prefix_set_.get());
size_t miss_count = 0;
for (size_t i = 0; i < prefixes.size(); ++i) {
+ bool found = prefix_set_->Exists(prefixes[i]);
+
if (browse_bloom_filter_->Exists(prefixes[i])) {
+ RecordPrefixSetInfo(PREFIX_SET_EVENT_BLOOM_HIT);
+ if (found)
+ RecordPrefixSetInfo(PREFIX_SET_EVENT_HIT);
prefix_hits->push_back(prefixes[i]);
if (prefix_miss_cache_.count(prefixes[i]) > 0)
++miss_count;
+ } else {
+ // Bloom filter misses should never be in prefix set.
+ DCHECK(!found);
+ if (found)
+ RecordPrefixSetInfo(PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT);
}
}
@@ -772,6 +818,9 @@ void SafeBrowsingDatabaseNew::UpdateBrowseStore() {
filter->Insert(add_prefixes[i].prefix);
}
+ scoped_ptr<safe_browsing::PrefixSet>
+ prefix_set(CreatePrefixSet(add_prefixes));
+
// This needs to be in sorted order by prefix for efficient access.
std::sort(add_full_hashes.begin(), add_full_hashes.end(),
SBAddFullHashPrefixLess);
@@ -789,6 +838,7 @@ void SafeBrowsingDatabaseNew::UpdateBrowseStore() {
pending_browse_hashes_.clear();
prefix_miss_cache_.clear();
browse_bloom_filter_.swap(filter);
+ prefix_set_.swap(prefix_set);
}
const base::TimeDelta bloom_gen = base::Time::Now() - before;
@@ -872,6 +922,12 @@ void SafeBrowsingDatabaseNew::LoadBloomFilter() {
if (!browse_bloom_filter_.get())
RecordFailure(FAILURE_DATABASE_FILTER_READ);
+
+ // Manually re-generate the prefix set from the main database.
+ // TODO(shess): Write/read for prefix set.
+ std::vector<SBAddPrefix> add_prefixes;
+ browse_store_->GetAddPrefixes(&add_prefixes);
+ prefix_set_.reset(CreatePrefixSet(add_prefixes));
}
bool SafeBrowsingDatabaseNew::Delete() {
« no previous file with comments | « chrome/browser/safe_browsing/safe_browsing_database.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698