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

Unified Diff: chrome/browser/safe_browsing/safe_browsing_store_file_unittest.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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/safe_browsing/safe_browsing_store_file.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/safe_browsing/safe_browsing_store_file_unittest.cc
diff --git a/chrome/browser/safe_browsing/safe_browsing_store_file_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_store_file_unittest.cc
index f62b261392015d11197a9a80886e943611590e9a..405e23a641c84d973ff2daf8aefeb33f90a96c05 100644
--- a/chrome/browser/safe_browsing/safe_browsing_store_file_unittest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_store_file_unittest.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/safe_browsing/safe_browsing_store_file.h"
#include "base/bind.h"
+#include "base/md5.h"
#include "base/scoped_temp_dir.h"
#include "chrome/browser/safe_browsing/safe_browsing_store_unittest_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -26,7 +27,10 @@ class SafeBrowsingStoreFileTest : public PlatformTest {
filename_ = filename_.AppendASCII("SafeBrowsingTestStore");
store_.reset(new SafeBrowsingStoreFile());
- store_->Init(filename_, base::Closure());
+ store_->Init(filename_,
+ base::Bind(&SafeBrowsingStoreFileTest::OnCorruptionDetected,
+ base::Unretained(this)));
+ corruption_detected_ = false;
}
virtual void TearDown() {
if (store_.get())
@@ -78,22 +82,14 @@ TEST_F(SafeBrowsingStoreFileTest, DetectsCorruption) {
// Load a store with some data.
SafeBrowsingStoreTestStorePrefix(store_.get());
- SafeBrowsingStoreFile test_store;
- test_store.Init(
- filename_,
- base::Bind(&SafeBrowsingStoreFileTest::OnCorruptionDetected,
- base::Unretained(this)));
-
- corruption_detected_ = false;
-
// Can successfully open and read the store.
std::vector<SBAddFullHash> pending_adds;
std::set<SBPrefix> prefix_misses;
SBAddPrefixes orig_prefixes;
std::vector<SBAddFullHash> orig_hashes;
- EXPECT_TRUE(test_store.BeginUpdate());
- EXPECT_TRUE(test_store.FinishUpdate(pending_adds, prefix_misses,
- &orig_prefixes, &orig_hashes));
+ EXPECT_TRUE(store_->BeginUpdate());
+ EXPECT_TRUE(store_->FinishUpdate(pending_adds, prefix_misses,
+ &orig_prefixes, &orig_hashes));
EXPECT_GT(orig_prefixes.size(), 0U);
EXPECT_GT(orig_hashes.size(), 0U);
EXPECT_FALSE(corruption_detected_);
@@ -114,9 +110,9 @@ TEST_F(SafeBrowsingStoreFileTest, DetectsCorruption) {
SBAddPrefixes add_prefixes;
std::vector<SBAddFullHash> add_hashes;
corruption_detected_ = false;
- EXPECT_TRUE(test_store.BeginUpdate());
- EXPECT_FALSE(test_store.FinishUpdate(pending_adds, prefix_misses,
- &add_prefixes, &add_hashes));
+ EXPECT_TRUE(store_->BeginUpdate());
+ EXPECT_FALSE(store_->FinishUpdate(pending_adds, prefix_misses,
+ &add_prefixes, &add_hashes));
EXPECT_TRUE(corruption_detected_);
EXPECT_EQ(add_prefixes.size(), 0U);
EXPECT_EQ(add_hashes.size(), 0U);
@@ -131,8 +127,70 @@ TEST_F(SafeBrowsingStoreFileTest, DetectsCorruption) {
// Detects corruption and fails to even begin the update.
corruption_detected_ = false;
- EXPECT_FALSE(test_store.BeginUpdate());
+ EXPECT_FALSE(store_->BeginUpdate());
+ EXPECT_TRUE(corruption_detected_);
+}
+
+TEST_F(SafeBrowsingStoreFileTest, CheckValidity) {
+ // Empty store is valid.
+ EXPECT_FALSE(file_util::PathExists(filename_));
+ ASSERT_TRUE(store_->BeginUpdate());
+ EXPECT_FALSE(corruption_detected_);
+ EXPECT_TRUE(store_->CheckValidity());
+ EXPECT_FALSE(corruption_detected_);
+ EXPECT_TRUE(store_->CancelUpdate());
+
+ // A store with some data is valid.
+ EXPECT_FALSE(file_util::PathExists(filename_));
+ SafeBrowsingStoreTestStorePrefix(store_.get());
+ EXPECT_TRUE(file_util::PathExists(filename_));
+ ASSERT_TRUE(store_->BeginUpdate());
+ EXPECT_FALSE(corruption_detected_);
+ EXPECT_TRUE(store_->CheckValidity());
+ EXPECT_FALSE(corruption_detected_);
+ EXPECT_TRUE(store_->CancelUpdate());
+}
+
+// Corrupt the payload.
+TEST_F(SafeBrowsingStoreFileTest, CheckValidityPayload) {
+ SafeBrowsingStoreTestStorePrefix(store_.get());
+ EXPECT_TRUE(file_util::PathExists(filename_));
+
+ // 37 is the most random prime number. It's also past the header,
+ // as corrupting the header would fail BeginUpdate() in which case
+ // CheckValidity() cannot be called.
+ const size_t kOffset = 37;
+
+ {
+ file_util::ScopedFILE file(file_util::OpenFile(filename_, "rb+"));
+ EXPECT_EQ(0, fseek(file.get(), kOffset, SEEK_SET));
+ EXPECT_GE(fputs("hello", file.get()), 0);
+ }
+ ASSERT_TRUE(store_->BeginUpdate());
+ EXPECT_FALSE(corruption_detected_);
+ EXPECT_FALSE(store_->CheckValidity());
+ EXPECT_TRUE(corruption_detected_);
+ EXPECT_TRUE(store_->CancelUpdate());
+}
+
+// Corrupt the checksum.
+TEST_F(SafeBrowsingStoreFileTest, CheckValidityChecksum) {
+ SafeBrowsingStoreTestStorePrefix(store_.get());
+ EXPECT_TRUE(file_util::PathExists(filename_));
+
+ // An offset from the end of the file which is in the checksum.
+ const int kOffset = -static_cast<int>(sizeof(base::MD5Digest));
+
+ {
+ file_util::ScopedFILE file(file_util::OpenFile(filename_, "rb+"));
+ EXPECT_EQ(0, fseek(file.get(), kOffset, SEEK_END));
+ EXPECT_GE(fputs("hello", file.get()), 0);
+ }
+ ASSERT_TRUE(store_->BeginUpdate());
+ EXPECT_FALSE(corruption_detected_);
+ EXPECT_FALSE(store_->CheckValidity());
EXPECT_TRUE(corruption_detected_);
+ EXPECT_TRUE(store_->CancelUpdate());
}
} // namespace
« no previous file with comments | « chrome/browser/safe_browsing/safe_browsing_store_file.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698