| Index: chrome/browser/privacy_blacklist/blacklist.cc
|
| ===================================================================
|
| --- chrome/browser/privacy_blacklist/blacklist.cc (revision 25875)
|
| +++ chrome/browser/privacy_blacklist/blacklist.cc (working copy)
|
| @@ -5,6 +5,7 @@
|
| #include "chrome/browser/privacy_blacklist/blacklist.h"
|
|
|
| #include <algorithm>
|
| +#include <limits>
|
| #include <string>
|
|
|
| #include "base/file_path.h"
|
| @@ -159,35 +160,50 @@
|
| entries_.push_back(entry);
|
| }
|
|
|
| -Blacklist::Blacklist(const FilePath& file) {
|
| +Blacklist::Blacklist(const FilePath& file) : is_good_(false) {
|
| // No blacklist, nothing to load.
|
| if (file.value().empty())
|
| return;
|
|
|
| - BlacklistStoreInput input(file_util::OpenFile(file, "rb"));
|
| + FILE* fp = file_util::OpenFile(file, "rb");
|
| + if (fp == NULL)
|
| + return;
|
|
|
| + BlacklistStoreInput input(fp);
|
| +
|
| // Read the providers
|
| std::size_t n = input.ReadNumProviders();
|
| + if (n == std::numeric_limits<uint32>::max())
|
| + return;
|
| +
|
| providers_.reserve(n);
|
| std::string name;
|
| std::string url;
|
| for (std::size_t i = 0; i < n; ++i) {
|
| - input.ReadProvider(&name, &url);
|
| + if (!input.ReadProvider(&name, &url))
|
| + return;
|
| providers_.push_back(new Provider(name.c_str(), url.c_str()));
|
| }
|
|
|
| // Read the entries
|
| n = input.ReadNumEntries();
|
| + if (n == std::numeric_limits<uint32>::max())
|
| + return;
|
| +
|
| std::string pattern;
|
| unsigned int attributes, provider;
|
| std::vector<std::string> types;
|
| for (unsigned int i = 0; i < n; ++i) {
|
| - input.ReadEntry(&pattern, &attributes, &types, &provider);
|
| + if (!input.ReadEntry(&pattern, &attributes, &types, &provider))
|
| + return;
|
| +
|
| Entry* entry = new Entry(pattern, providers_[provider]);
|
| entry->AddAttributes(attributes);
|
| entry->SwapTypes(&types);
|
| blacklist_.push_back(entry);
|
| }
|
| +
|
| + is_good_ = true;
|
| }
|
|
|
| Blacklist::~Blacklist() {
|
| @@ -202,6 +218,9 @@
|
| // Returns a pointer to the Blacklist-owned entry which matches the given
|
| // URL. If no matching Entry is found, returns null.
|
| Blacklist::Match* Blacklist::findMatch(const GURL& url) const {
|
| + if (!is_good_)
|
| + return NULL; // Don't attempt to find matches if the data is corrupt.
|
| +
|
| // Never match something which is not http, https or ftp.
|
| // TODO(idanan): Investigate if this would be an inclusion test instead of an
|
| // exclusion test and if there are other schemes to test for.
|
|
|