Index: chrome/browser/safe_browsing/client_side_detection_service.cc |
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc |
index 878d49e45d8f3c5708e8606904f9842bbbbac6ae..fc3aa2c7d637203025e632e7f45777e2958b29f1 100644 |
--- a/chrome/browser/safe_browsing/client_side_detection_service.cc |
+++ b/chrome/browser/safe_browsing/client_side_detection_service.cc |
@@ -76,7 +76,7 @@ ClientSideDetectionService::~ClientSideDetectionService() { |
client_phishing_reports_.clear(); |
} |
-/* static */ |
+// static |
ClientSideDetectionService* ClientSideDetectionService::Create( |
net::URLRequestContextGetter* request_context_getter) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -299,6 +299,8 @@ void ClientSideDetectionService::HandleModelResponse( |
model_status = MODEL_PARSE_ERROR; |
} else if (!model->IsInitialized() || !model->has_version()) { |
model_status = MODEL_MISSING_FIELDS; |
+ } else if (!ModelHasValidHashIds(*model)) { |
+ model_status = MODEL_BAD_HASH_IDS; |
} else if (model->version() < 0 || |
(model_.get() && model->version() < model_->version())) { |
model_status = MODEL_INVALID_VERSION_NUMBER; |
@@ -433,7 +435,7 @@ bool ClientSideDetectionService::InitializePrivateNetworks() { |
return true; |
} |
-/* static */ |
+// static |
void ClientSideDetectionService::SetBadSubnets(const ClientSideModel& model, |
BadSubnetMap* bad_subnets) { |
bad_subnets->clear(); |
@@ -459,4 +461,29 @@ void ClientSideDetectionService::SetBadSubnets(const ClientSideModel& model, |
(*bad_subnets)[mask].insert(model.bad_subnet(i).prefix()); |
} |
} |
+ |
+// static |
+bool ClientSideDetectionService::ModelHasValidHashIds( |
+ const ClientSideModel& model) { |
+ const int max_index = model.hashes_size() - 1; |
+ for (int i = 0; i < model.rule_size(); ++i) { |
+ for (int j = 0; j < model.rule(i).feature_size(); ++j) { |
+ if (model.rule(i).feature(j) < 0 || |
+ model.rule(i).feature(j) > max_index) { |
+ return false; |
+ } |
+ } |
+ } |
+ for (int i = 0; i < model.page_term_size(); ++i) { |
+ if (model.page_term(i) < 0 || model.page_term(i) > max_index) { |
+ return false; |
+ } |
+ } |
+ for (int i = 0; i < model.page_word_size(); ++i) { |
+ if (model.page_word(i) < 0 || model.page_word(i) > max_index) { |
+ return false; |
+ } |
+ } |
+ return true; |
+} |
} // namespace safe_browsing |