summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-07 19:49:42 +0000
committergab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-07 19:49:42 +0000
commit17c6b79c881f7bfab015d858c611598b49a595f7 (patch)
treebf7b2eb224fa5a52058c759f848aa009c1ccc2c3
parenta6e038dd9d7cb82698baeb65387e47a7f7445967 (diff)
downloadchromium_src-17c6b79c881f7bfab015d858c611598b49a595f7.zip
chromium_src-17c6b79c881f7bfab015d858c611598b49a595f7.tar.gz
chromium_src-17c6b79c881f7bfab015d858c611598b49a595f7.tar.bz2
Merge 224408 "Verify the integrity of the pref file."
> Verify the integrity of the pref file. > > R=sail@chromium.org > > Review URL: https://codereview.chromium.org/23531072 TBR=gab@chromium.org Review URL: https://codereview.chromium.org/26260003 git-svn-id: svn://svn.chromium.org/chrome/branches/1599/src@227321 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/profiles/file_path_verifier_win.cc79
-rw-r--r--chrome/browser/profiles/file_path_verifier_win.h35
-rw-r--r--chrome/browser/profiles/file_path_verifier_win_unittest.cc40
-rw-r--r--chrome/browser/profiles/profile_impl.cc14
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_tests_unit.gypi1
6 files changed, 171 insertions, 0 deletions
diff --git a/chrome/browser/profiles/file_path_verifier_win.cc b/chrome/browser/profiles/file_path_verifier_win.cc
new file mode 100644
index 0000000..53b9e12
--- /dev/null
+++ b/chrome/browser/profiles/file_path_verifier_win.cc
@@ -0,0 +1,79 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/profiles/file_path_verifier_win.h"
+
+#include <windows.h>
+
+#include "base/file_util.h"
+#include "base/files/file_path.h"
+#include "base/metrics/histogram.h"
+
+namespace internal {
+
+PathComparisonReason ComparePathsIgnoreCase(const base::FilePath& path1,
+ const base::FilePath& path2) {
+ PathComparisonReason reason = PATH_COMPARISON_FAILED_UNKNOWN;
+
+ if (base::FilePath::CompareEqualIgnoreCase(path1.value(), path2.value())) {
+ reason = PATH_COMPARISON_EQUAL;
+ } else if (base::FilePath::CompareEqualIgnoreCase(path1.BaseName().value(),
+ path2.BaseName().value())) {
+ reason = PATH_COMPARISON_FAILED_SAMEBASE;
+ } else if (base::FilePath::CompareEqualIgnoreCase(path1.DirName().value(),
+ path2.DirName().value())) {
+ reason = PATH_COMPARISON_FAILED_SAMEDIR;
+ }
+
+ return reason;
+}
+
+} // namespace internal
+
+void VerifyFileAtPath(const base::FilePath& file,
+ const std::string& metric_suffix) {
+ // This enum is used in UMA histograms and should never be re-ordered.
+ enum FileVerificationResult {
+ FILE_VERIFICATION_SUCCESS,
+ FILE_VERIFICATION_FILE_NOT_FOUND,
+ FILE_VERIFICATION_INTERNAL_ERROR,
+ FILE_VERIFICATION_FAILED_UNKNOWN,
+ FILE_VERIFICATION_FAILED_SAMEBASE,
+ FILE_VERIFICATION_FAILED_SAMEDIR,
+ NUM_FILE_VERIFICATION_RESULTS
+ } file_verification_result = FILE_VERIFICATION_FAILED_UNKNOWN;
+
+ base::FilePath normalized_path;
+ if (!file_util::NormalizeFilePath(file, &normalized_path)) {
+ if (::GetLastError() == ERROR_FILE_NOT_FOUND)
+ file_verification_result = FILE_VERIFICATION_FILE_NOT_FOUND;
+ else
+ file_verification_result = FILE_VERIFICATION_INTERNAL_ERROR;
+ } else {
+ internal::PathComparisonReason path_comparison_reason =
+ internal::ComparePathsIgnoreCase(file, normalized_path);
+ switch (path_comparison_reason) {
+ case internal::PATH_COMPARISON_EQUAL:
+ file_verification_result = FILE_VERIFICATION_SUCCESS;
+ break;
+ case internal::PATH_COMPARISON_FAILED_SAMEBASE:
+ file_verification_result = FILE_VERIFICATION_FAILED_SAMEBASE;
+ break;
+ case internal::PATH_COMPARISON_FAILED_SAMEDIR:
+ file_verification_result = FILE_VERIFICATION_FAILED_SAMEDIR;
+ break;
+ }
+ }
+
+ // Note: This leaks memory, which is the expected behavior as the factory
+ // creates and owns the histogram.
+ base::HistogramBase* histogram =
+ base::LinearHistogram::FactoryGet(
+ "Stability.FileAtPath." + metric_suffix,
+ 1,
+ NUM_FILE_VERIFICATION_RESULTS,
+ NUM_FILE_VERIFICATION_RESULTS + 1,
+ base::HistogramBase::kUmaTargetedHistogramFlag);
+ histogram->Add(file_verification_result);
+}
diff --git a/chrome/browser/profiles/file_path_verifier_win.h b/chrome/browser/profiles/file_path_verifier_win.h
new file mode 100644
index 0000000..bacd5aa
--- /dev/null
+++ b/chrome/browser/profiles/file_path_verifier_win.h
@@ -0,0 +1,35 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PROFILES_FILE_PATH_VERIFIER_WIN_H_
+#define CHROME_BROWSER_PROFILES_FILE_PATH_VERIFIER_WIN_H_
+
+#include <string>
+
+namespace base {
+class FilePath;
+}
+
+namespace internal {
+
+enum PathComparisonReason {
+ PATH_COMPARISON_EQUAL,
+ PATH_COMPARISON_FAILED_UNKNOWN,
+ PATH_COMPARISON_FAILED_SAMEBASE, // Not the same path, but same BaseName.
+ PATH_COMPARISON_FAILED_SAMEDIR, // Not the same path, but same DirName.
+};
+
+// Returns a PathComparisonReason based on the result of comparing |path1|
+// and |path2| case-insensitively.
+PathComparisonReason ComparePathsIgnoreCase(const base::FilePath& path1,
+ const base::FilePath& path2);
+
+} // namespace internal
+
+// Verifies that |file| is found as expected on disk and reports the result via
+// a UMA stat with suffix |metric_suffix|.
+void VerifyFileAtPath(const base::FilePath& file,
+ const std::string& metric_suffix);
+
+#endif // CHROME_BROWSER_PROFILES_FILE_PATH_VERIFIER_WIN_H_
diff --git a/chrome/browser/profiles/file_path_verifier_win_unittest.cc b/chrome/browser/profiles/file_path_verifier_win_unittest.cc
new file mode 100644
index 0000000..e2c922f
--- /dev/null
+++ b/chrome/browser/profiles/file_path_verifier_win_unittest.cc
@@ -0,0 +1,40 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/profiles/file_path_verifier_win.h"
+
+#include "base/files/file_path.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+TEST(FilePathVerifierTest, ComparePathsIgnoreCase) {
+ const struct PathComparisonReasonTestData {
+ const base::FilePath::CharType* inputs[2];
+ internal::PathComparisonReason expected;
+ } cases[] = {
+ { { FILE_PATH_LITERAL("test/foo.bar"),
+ FILE_PATH_LITERAL("test/foo.bar") },
+ internal::PATH_COMPARISON_EQUAL},
+ { { FILE_PATH_LITERAL("test\\foo.bar"),
+ FILE_PATH_LITERAL("test\\foo.bar") },
+ internal::PATH_COMPARISON_EQUAL},
+ { { FILE_PATH_LITERAL("test/foo.bar"),
+ FILE_PATH_LITERAL("test/foo.baz") },
+ internal::PATH_COMPARISON_FAILED_SAMEDIR},
+ { { FILE_PATH_LITERAL("test/foo.bar"),
+ FILE_PATH_LITERAL("test/joe/foo.bar") },
+ internal::PATH_COMPARISON_FAILED_SAMEBASE},
+ { { FILE_PATH_LITERAL("test/foo.bar"),
+ FILE_PATH_LITERAL("jack/bar.buz") },
+ internal::PATH_COMPARISON_FAILED_UNKNOWN},
+ };
+
+ for (size_t i = 0; i < arraysize(cases); ++i) {
+ base::FilePath p1(cases[i].inputs[0]);
+ base::FilePath p2(cases[i].inputs[1]);
+ internal::PathComparisonReason reason =
+ internal::ComparePathsIgnoreCase(p1, p2);
+ EXPECT_EQ(cases[i].expected, reason) <<
+ "i: " << i << ", p1: " << p1.value() << ", p2: " << p2.value();
+ }
+}
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index c3650e8..b468c25 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -98,6 +98,7 @@
#include "ui/base/l10n/l10n_util.h"
#if defined(OS_WIN)
+#include "chrome/browser/profiles/file_path_verifier_win.h"
#include "chrome/installer/util/install_util.h"
#endif
@@ -238,6 +239,17 @@ std::string ExitTypeToSessionTypePrefValue(Profile::ExitType type) {
return std::string();
}
+void SchedulePrefsFileVerification(const base::FilePath& prefs_file) {
+#if defined(OS_WIN)
+ // Only do prefs file verification on Windows.
+ const int kVerifyPrefsFileDelaySeconds = 60;
+ BrowserThread::GetBlockingPool()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&VerifyFileAtPath, prefs_file, "Preferences"),
+ base::TimeDelta::FromSeconds(kVerifyPrefsFileDelaySeconds));
+#endif
+}
+
} // namespace
// static
@@ -768,6 +780,8 @@ void ProfileImpl::OnPrefsLoaded(bool success) {
predictor_));
}
+ SchedulePrefsFileVerification(GetPrefFilePath());
+
ChromeVersionService::OnProfileLoaded(prefs_.get(), IsNewProfile());
DoFinalInit();
}
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index c45ad0a..b31118d 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1641,6 +1641,8 @@
'browser/profiles/chrome_browser_main_extra_parts_profiles.h',
'browser/profiles/chrome_version_service.cc',
'browser/profiles/chrome_version_service.h',
+ 'browser/profiles/file_path_verifier_win.cc',
+ 'browser/profiles/file_path_verifier_win.h',
'browser/profiles/gaia_info_update_service.cc',
'browser/profiles/gaia_info_update_service.h',
'browser/profiles/gaia_info_update_service_factory.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 1a00408..f7394c8 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -1111,6 +1111,7 @@
'browser/process_singleton_mac_unittest.cc',
'browser/profile_resetter/profile_resetter_unittest.cc',
'browser/profiles/avatar_menu_model_unittest.cc',
+ 'browser/profiles/file_path_verifier_win_unittest.cc',
'browser/profiles/gaia_info_update_service_unittest.cc',
'browser/profiles/off_the_record_profile_impl_unittest.cc',
'browser/profiles/profile_downloader_unittest.cc',