summaryrefslogtreecommitdiffstats
path: root/chrome_elf/blacklist/test
diff options
context:
space:
mode:
authorrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-19 23:15:59 +0000
committerrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-19 23:15:59 +0000
commitcab30871faac531e20f5c4e134d773d83c7a7281 (patch)
treefeae2cc2d6f41efc4886e1a4f690e74c618ed582 /chrome_elf/blacklist/test
parent68d0eeb4f98c230419afda0ad2bdf6b576cde3c2 (diff)
downloadchromium_src-cab30871faac531e20f5c4e134d773d83c7a7281.zip
chromium_src-cab30871faac531e20f5c4e134d773d83c7a7281.tar.gz
chromium_src-cab30871faac531e20f5c4e134d773d83c7a7281.tar.bz2
Reland of http://crrev.com/241548.
It broke on the main waterfall after going through the CQ. Two changes: * No-op the loading test on 64-bit. * Remove the 'IgnoreAllDefaultLibraries' directive. This seems to exclude the CRT on some builders. Original CL description: Chrome browser process DLL blacklist. This patch allows for blocking of module loading in the browser process. It does not actually prevent any modules from loading. Original Review URL: https://codereview.chromium.org/107663008 BUG=329023 TEST=chrome_elf_unittests.exe TBR=cpu Review URL: https://codereview.chromium.org/118343004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@241972 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_elf/blacklist/test')
-rw-r--r--chrome_elf/blacklist/test/blacklist_test.cc127
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_dll_1.cc9
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_dll_1.def5
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_dll_2.cc19
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_dll_2.def8
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_dll_3.cc14
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_dll_3.lib1
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_main.cc17
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_main_dll.cc17
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_main_dll.def10
-rw-r--r--chrome_elf/blacklist/test/blacklist_test_main_dll.h10
11 files changed, 237 insertions, 0 deletions
diff --git a/chrome_elf/blacklist/test/blacklist_test.cc b/chrome_elf/blacklist/test/blacklist_test.cc
new file mode 100644
index 0000000..6556e25
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test.cc
@@ -0,0 +1,127 @@
+// 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 "base/environment.h"
+#include "base/files/file_path.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/path_service.h"
+#include "base/scoped_native_library.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/test_reg_util_win.h"
+#include "chrome_elf/blacklist/blacklist.h"
+#include "chrome_elf/blacklist/test/blacklist_test_main_dll.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+const wchar_t kTestDllName1[] = L"blacklist_test_dll_1.dll";
+const wchar_t kTestDllName2[] = L"blacklist_test_dll_2.dll";
+const wchar_t kTestDllName3[] = L"blacklist_test_dll_3.dll";
+
+const wchar_t kDll2Beacon[] = L"{F70A0100-2889-4629-9B44-610FE5C73231}";
+const wchar_t kDll3Beacon[] = L"{9E056AEC-169E-400c-B2D0-5A07E3ACE2EB}";
+
+extern const wchar_t* kEnvVars[];
+
+extern "C" {
+// When modifying the blacklist in the test process, use the exported test dll
+// functions on the test blacklist dll, not the ones linked into the test
+// executable itself.
+__declspec(dllimport) void TestDll_AddDllToBlacklist(const wchar_t* dll_name);
+__declspec(dllimport) void TestDll_RemoveDllFromBlacklist(
+ const wchar_t* dll_name);
+}
+
+class BlacklistTest : public testing::Test {
+ virtual void SetUp() {
+ // Force an import from blacklist_test_main_dll.
+ InitBlacklistTestDll();
+
+ // Ensure that the beacon state starts off cleared.
+ blacklist::ClearBeacon();
+ }
+
+ virtual void TearDown() {
+ TestDll_RemoveDllFromBlacklist(kTestDllName1);
+ TestDll_RemoveDllFromBlacklist(kTestDllName2);
+ }
+};
+
+TEST_F(BlacklistTest, Beacon) {
+ registry_util::RegistryOverrideManager override_manager;
+ override_manager.OverrideRegistry(HKEY_CURRENT_USER, L"beacon_test");
+
+ // First call should succeed as the beacon is newly created.
+ EXPECT_TRUE(blacklist::CreateBeacon());
+
+ // Second call should fail indicating the beacon already existed.
+ EXPECT_FALSE(blacklist::CreateBeacon());
+
+ // First call should find the beacon and delete it.
+ EXPECT_TRUE(blacklist::ClearBeacon());
+
+ // Second call should fail to find the beacon and delete it.
+ EXPECT_FALSE(blacklist::ClearBeacon());
+}
+
+TEST_F(BlacklistTest, AddAndRemoveModules) {
+ EXPECT_TRUE(blacklist::AddDllToBlacklist(L"foo.dll"));
+ // Adding the same item twice should be idempotent.
+ EXPECT_TRUE(blacklist::AddDllToBlacklist(L"foo.dll"));
+ EXPECT_TRUE(blacklist::RemoveDllFromBlacklist(L"foo.dll"));
+ EXPECT_FALSE(blacklist::RemoveDllFromBlacklist(L"foo.dll"));
+
+ std::vector<string16> added_dlls;
+ added_dlls.reserve(blacklist::kTroublesomeDllsMaxCount);
+ for (int i = 0; i < blacklist::kTroublesomeDllsMaxCount; ++i) {
+ added_dlls.push_back(base::IntToString16(i) + L".dll");
+ EXPECT_TRUE(blacklist::AddDllToBlacklist(added_dlls[i].c_str())) << i;
+ }
+ EXPECT_FALSE(blacklist::AddDllToBlacklist(L"overflow.dll"));
+ for (int i = 0; i < blacklist::kTroublesomeDllsMaxCount; ++i) {
+ EXPECT_TRUE(blacklist::RemoveDllFromBlacklist(added_dlls[i].c_str())) << i;
+ }
+ EXPECT_FALSE(blacklist::RemoveDllFromBlacklist(L"0.dll"));
+ EXPECT_FALSE(blacklist::RemoveDllFromBlacklist(L"63.dll"));
+}
+
+TEST_F(BlacklistTest, LoadBlacklistedLibrary) {
+// TODO(robertshield): Add 64-bit support.
+#if !defined(_WIN64)
+ base::FilePath current_dir;
+ ASSERT_TRUE(PathService::Get(base::DIR_EXE, &current_dir));
+
+ // Test that an un-blacklisted DLL can load correctly.
+ base::ScopedNativeLibrary dll1(current_dir.Append(kTestDllName1));
+ EXPECT_TRUE(dll1.is_valid());
+ dll1.Reset(NULL);
+
+ struct TestData {
+ const wchar_t* dll_name;
+ const wchar_t* dll_beacon;
+ } test_data[] = {
+ { kTestDllName2, kDll2Beacon },
+ { kTestDllName3, kDll3Beacon }
+ };
+ for (int i = 0 ; i < arraysize(test_data); ++i) {
+ // Add the DLL to the blacklist, ensure that it is not loaded both by
+ // inspecting the handle returned by LoadLibrary and by looking for an
+ // environment variable that is set when the DLL's entry point is called.
+ TestDll_AddDllToBlacklist(test_data[i].dll_name);
+ base::ScopedNativeLibrary dll_blacklisted(
+ current_dir.Append(test_data[i].dll_name));
+ EXPECT_FALSE(dll_blacklisted.is_valid());
+ EXPECT_EQ(0u, ::GetEnvironmentVariable(test_data[i].dll_beacon, NULL, 0));
+ dll_blacklisted.Reset(NULL);
+
+ // Remove the DLL from the blacklist. Ensure that it loads and that its
+ // entry point was called.
+ TestDll_RemoveDllFromBlacklist(test_data[i].dll_name);
+ base::ScopedNativeLibrary dll(current_dir.Append(test_data[i].dll_name));
+ EXPECT_TRUE(dll.is_valid());
+ EXPECT_NE(0u, ::GetEnvironmentVariable(test_data[i].dll_beacon, NULL, 0));
+ dll.Reset(NULL);
+ }
+#endif
+}
diff --git a/chrome_elf/blacklist/test/blacklist_test_dll_1.cc b/chrome_elf/blacklist/test/blacklist_test_dll_1.cc
new file mode 100644
index 0000000..a4e414d
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_dll_1.cc
@@ -0,0 +1,9 @@
+// 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 <windows.h>
+
+BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) {
+ return TRUE;
+}
diff --git a/chrome_elf/blacklist/test/blacklist_test_dll_1.def b/chrome_elf/blacklist/test/blacklist_test_dll_1.def
new file mode 100644
index 0000000..fc7b7be
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_dll_1.def
@@ -0,0 +1,5 @@
+; 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.
+
+LIBRARY "blacklist_test_dll_1.dll"
diff --git a/chrome_elf/blacklist/test/blacklist_test_dll_2.cc b/chrome_elf/blacklist/test/blacklist_test_dll_2.cc
new file mode 100644
index 0000000..7a4a7dc
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_dll_2.cc
@@ -0,0 +1,19 @@
+// 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 <windows.h>
+
+const wchar_t kDll2Beacon[] = L"{F70A0100-2889-4629-9B44-610FE5C73231}";
+
+extern "C" {
+// Have a dummy export so that the module gets an export table entry.
+void DummyExport() {}
+}
+
+BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) {
+ if (reason == DLL_PROCESS_ATTACH) {
+ ::SetEnvironmentVariable(kDll2Beacon, L"1");
+ }
+ return TRUE;
+}
diff --git a/chrome_elf/blacklist/test/blacklist_test_dll_2.def b/chrome_elf/blacklist/test/blacklist_test_dll_2.def
new file mode 100644
index 0000000..2cc122f
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_dll_2.def
@@ -0,0 +1,8 @@
+; 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.
+
+LIBRARY "blacklist_test_dll_2.dll"
+
+EXPORTS
+ DummyExport
diff --git a/chrome_elf/blacklist/test/blacklist_test_dll_3.cc b/chrome_elf/blacklist/test/blacklist_test_dll_3.cc
new file mode 100644
index 0000000..b4a6959
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_dll_3.cc
@@ -0,0 +1,14 @@
+// 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 <windows.h>
+
+const wchar_t kDll3Beacon[] = L"{9E056AEC-169E-400c-B2D0-5A07E3ACE2EB}";
+
+BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) {
+ if (reason == DLL_PROCESS_ATTACH) {
+ ::SetEnvironmentVariable(kDll3Beacon, L"1");
+ }
+ return TRUE;
+}
diff --git a/chrome_elf/blacklist/test/blacklist_test_dll_3.lib b/chrome_elf/blacklist/test/blacklist_test_dll_3.lib
new file mode 100644
index 0000000..7ab9a11
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_dll_3.lib
@@ -0,0 +1 @@
+LIBRARY "blacklist_test_dll_2.dll"
diff --git a/chrome_elf/blacklist/test/blacklist_test_main.cc b/chrome_elf/blacklist/test/blacklist_test_main.cc
new file mode 100644
index 0000000..c84b5ad
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_main.cc
@@ -0,0 +1,17 @@
+// 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 "base/at_exit.h"
+#include "chrome_elf/blacklist/test/blacklist_test_main_dll.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+int main(int argc, char** argv) {
+ testing::InitGoogleTest(&argc, argv);
+
+ base::AtExitManager at_exit_manager;
+
+ InitBlacklistTestDll();
+
+ RUN_ALL_TESTS();
+}
diff --git a/chrome_elf/blacklist/test/blacklist_test_main_dll.cc b/chrome_elf/blacklist/test/blacklist_test_main_dll.cc
new file mode 100644
index 0000000..54e5eb8
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_main_dll.cc
@@ -0,0 +1,17 @@
+// 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 <windows.h>
+
+#include "chrome_elf/blacklist/blacklist.h"
+
+extern "C" void InitBlacklistTestDll() {}
+
+BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) {
+ if (reason == DLL_PROCESS_ATTACH) {
+ blacklist::Initialize(true); // force always on, no beacon
+ }
+
+ return TRUE;
+}
diff --git a/chrome_elf/blacklist/test/blacklist_test_main_dll.def b/chrome_elf/blacklist/test/blacklist_test_main_dll.def
new file mode 100644
index 0000000..63522a0
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_main_dll.def
@@ -0,0 +1,10 @@
+; 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.
+
+LIBRARY "blacklist_test_main_dll.dll"
+
+EXPORTS
+ TestDll_AddDllToBlacklist=AddDllToBlacklist
+ TestDll_RemoveDllFromBlacklist=RemoveDllFromBlacklist
+ InitBlacklistTestDll
diff --git a/chrome_elf/blacklist/test/blacklist_test_main_dll.h b/chrome_elf/blacklist/test/blacklist_test_main_dll.h
new file mode 100644
index 0000000..a004f9b
--- /dev/null
+++ b/chrome_elf/blacklist/test/blacklist_test_main_dll.h
@@ -0,0 +1,10 @@
+// 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_ELF_BLACKLIST_TEST_BLACKLIST_TEST_MAIN_DLL_H_
+#define CHROME_ELF_BLACKLIST_TEST_BLACKLIST_TEST_MAIN_DLL_H_
+
+extern "C" void InitBlacklistTestDll();
+
+#endif // CHROME_ELF_BLACKLIST_TEST_BLACKLIST_TEST_MAIN_DLL_H_