15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/environment.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file_path.h" 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/i18n/case_conversion.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/path_service.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/scoped_native_library.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string16.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/test/test_reg_util_win.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/win/registry.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome_elf/blacklist/blacklist.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome_elf/blacklist/test/blacklist_test_main_dll.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome_elf/chrome_elf_constants.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "version.h" // NOLINT 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const wchar_t kTestDllName1[] = L"blacklist_test_dll_1.dll"; 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const wchar_t kTestDllName2[] = L"blacklist_test_dll_2.dll"; 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const wchar_t kTestDllName3[] = L"blacklist_test_dll_3.dll"; 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const wchar_t kDll2Beacon[] = L"{F70A0100-2889-4629-9B44-610FE5C73231}"; 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const wchar_t kDll3Beacon[] = L"{9E056AEC-169E-400c-B2D0-5A07E3ACE2EB}"; 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const wchar_t* kEnvVars[]; 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern "C" { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// When modifying the blacklist in the test process, use the exported test dll 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// functions on the test blacklist dll, not the ones linked into the test 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// executable itself. 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch__declspec(dllimport) void TestDll_AddDllsFromRegistryToBlacklist(); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)__declspec(dllimport) bool TestDll_AddDllToBlacklist(const wchar_t* dll_name); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)__declspec(dllimport) bool TestDll_IsBlacklistInitialized(); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)__declspec(dllimport) bool TestDll_RemoveDllFromBlacklist( 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const wchar_t* dll_name); 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)__declspec(dllimport) bool TestDll_SuccessfullyBlocked( 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const wchar_t** blocked_dlls, 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int* size); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class BlacklistTest : public testing::Test { 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) BlacklistTest() : override_manager_() { 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci override_manager_.OverrideRegistry(HKEY_CURRENT_USER); 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<base::win::RegKey> blacklist_registry_key_; 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry_util::RegistryOverrideManager override_manager_; 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetUp() { 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Force an import from blacklist_test_main_dll. 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitBlacklistTestDll(); 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist_registry_key_.reset( 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new base::win::RegKey(HKEY_CURRENT_USER, 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::kRegistryBeaconPath, 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) KEY_QUERY_VALUE | KEY_SET_VALUE)); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void TearDown() { 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestDll_RemoveDllFromBlacklist(kTestDllName1); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestDll_RemoveDllFromBlacklist(kTestDllName2); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestDll_RemoveDllFromBlacklist(kTestDllName3); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct TestData { 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const wchar_t* dll_name; 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const wchar_t* dll_beacon; 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} test_data[] = { 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {kTestDllName2, kDll2Beacon}, 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if !defined(_WIN64) 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The third test dll is special in that it does not contain an export 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // table. This prevents SafeGetImageInfo from extracting the name from there 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // AND for some reason NtQueryVirtualMemory with MemorySectionName returns 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // STATUS_ACCESS_VIOLATION in 64 bit builds for reasons still unknown. 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // http://crbug.com/397137 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {kTestDllName3, kDll3Beacon} 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(BlacklistTest, Beacon) { 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Ensure that the beacon state starts off 'running' for this version. 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LONG result = blacklist_registry_key_->WriteValue( 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::kBeaconState, blacklist::BLACKLIST_SETUP_RUNNING); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, result); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result = blacklist_registry_key_->WriteValue(blacklist::kBeaconVersion, 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TEXT(CHROME_VERSION_STRING)); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, result); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First call should find the beacon and reset it. 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(blacklist::ResetBeacon()); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First call should succeed as the beacon is enabled. 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(blacklist::LeaveSetupBeacon()); 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(BlacklistTest, AddAndRemoveModules) { 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(blacklist::AddDllToBlacklist(L"foo.dll")); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Adding the same item twice should be idempotent. 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(blacklist::AddDllToBlacklist(L"foo.dll")); 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(blacklist::RemoveDllFromBlacklist(L"foo.dll")); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(blacklist::RemoveDllFromBlacklist(L"foo.dll")); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Increase the blacklist size by 1 to include the NULL pointer 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // that marks the end. 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int empty_spaces = blacklist::kTroublesomeDllsMaxCount - ( 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blacklist::BlacklistSize() + 1); 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> added_dlls; 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) added_dlls.reserve(empty_spaces); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = 0; i < empty_spaces; ++i) { 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) added_dlls.push_back(base::IntToString16(i) + L".dll"); 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(blacklist::AddDllToBlacklist(added_dlls[i].c_str())) << i; 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(blacklist::AddDllToBlacklist(L"overflow.dll")); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = 0; i < empty_spaces; ++i) { 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(blacklist::RemoveDllFromBlacklist(added_dlls[i].c_str())) << i; 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(blacklist::RemoveDllFromBlacklist(added_dlls[0].c_str())); 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(blacklist::RemoveDllFromBlacklist( 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) added_dlls[empty_spaces - 1].c_str())); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(BlacklistTest, SuccessfullyBlocked) { 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure that we have at least 5 dlls to blacklist. 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int blacklist_size = blacklist::BlacklistSize(); 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const int kDesiredBlacklistSize = 5; 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (int i = blacklist_size; i < kDesiredBlacklistSize; ++i) { 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16 new_dll_name(base::IntToString16(i) + L".dll"); 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(blacklist::AddDllToBlacklist(new_dll_name.c_str())); 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Block 5 dlls, one at a time, starting from the end of the list, and 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // ensuring SuccesfullyBlocked correctly passes the list of blocked dlls. 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (int i = 0; i < kDesiredBlacklistSize; ++i) { 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blacklist::BlockedDll(i); 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int size = 0; 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blacklist::SuccessfullyBlocked(NULL, &size); 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(i + 1, size); 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<const wchar_t*> blocked_dlls(size); 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blacklist::SuccessfullyBlocked(&(blocked_dlls[0]), &size); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(i + 1, size); 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t j = 0; j < blocked_dlls.size(); ++j) { 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(blocked_dlls[j], blacklist::g_troublesome_dlls[j]); 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CheckBlacklistedDllsNotLoaded() { 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath current_dir; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(PathService::Get(base::DIR_EXE, ¤t_dir)); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (int i = 0; i < arraysize(test_data); ++i) { 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Ensure that the dll has not been loaded both by inspecting the handle 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // returned by LoadLibrary and by looking for an environment variable that 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // is set when the DLL's entry point is called. 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ScopedNativeLibrary dll_blacklisted( 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_dir.Append(test_data[i].dll_name)); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(dll_blacklisted.is_valid()); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0u, ::GetEnvironmentVariable(test_data[i].dll_beacon, NULL, 0)); 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dll_blacklisted.Reset(NULL); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure that the dll is recorded as blocked. 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int array_size = 1; 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const wchar_t* blocked_dll = NULL; 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestDll_SuccessfullyBlocked(&blocked_dll, &array_size); 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1, array_size); 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(test_data[i].dll_name, base::string16(blocked_dll)); 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Remove the DLL from the blacklist. Ensure that it loads and that its 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // entry point was called. 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(TestDll_RemoveDllFromBlacklist(test_data[i].dll_name)); 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ScopedNativeLibrary dll(current_dir.Append(test_data[i].dll_name)); 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(dll.is_valid()); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(0u, ::GetEnvironmentVariable(test_data[i].dll_beacon, NULL, 0)); 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dll.Reset(NULL); 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ::SetEnvironmentVariable(test_data[i].dll_beacon, NULL); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ensure that the dll won't load even if the name has different 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // capitalization. 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 uppercase_name = base::i18n::ToUpper(test_data[i].dll_name); 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(TestDll_AddDllToBlacklist(uppercase_name.c_str())); 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ScopedNativeLibrary dll_blacklisted_different_case( 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_dir.Append(test_data[i].dll_name)); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(dll_blacklisted_different_case.is_valid()); 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0u, ::GetEnvironmentVariable(test_data[i].dll_beacon, NULL, 0)); 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dll_blacklisted_different_case.Reset(NULL); 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(TestDll_RemoveDllFromBlacklist(uppercase_name.c_str())); 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The blocked dll was removed, so we shouldn't get anything returned 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // here. 20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int num_blocked_dlls = 0; 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestDll_SuccessfullyBlocked(NULL, &num_blocked_dlls); 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, num_blocked_dlls); 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(BlacklistTest, LoadBlacklistedLibrary) { 21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath current_dir; 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(PathService::Get(base::DIR_EXE, ¤t_dir)); 21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Ensure that the blacklist is loaded. 21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(TestDll_IsBlacklistInitialized()); 21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Test that an un-blacklisted DLL can load correctly. 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::ScopedNativeLibrary dll1(current_dir.Append(kTestDllName1)); 21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(dll1.is_valid()); 22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dll1.Reset(NULL); 22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int num_blocked_dlls = 0; 22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestDll_SuccessfullyBlocked(NULL, &num_blocked_dlls); 22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, num_blocked_dlls); 22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Add all DLLs to the blacklist then check they are blocked. 22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (int i = 0; i < arraysize(test_data); ++i) { 22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(TestDll_AddDllToBlacklist(test_data[i].dll_name)); 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CheckBlacklistedDllsNotLoaded(); 23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(BlacklistTest, AddDllsFromRegistryToBlacklist) { 23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Ensure that the blacklist is loaded. 23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(TestDll_IsBlacklistInitialized()); 23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Delete the finch registry key to clear its values. 23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::win::RegKey key(HKEY_CURRENT_USER, 23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blacklist::kRegistryFinchListPath, 24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) KEY_QUERY_VALUE | KEY_SET_VALUE); 24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) key.DeleteKey(L""); 24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Add the test dlls to the registry (with their name as both key and value). 24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::win::RegKey finch_blacklist_registry_key( 24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) HKEY_CURRENT_USER, 24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blacklist::kRegistryFinchListPath, 24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) KEY_QUERY_VALUE | KEY_SET_VALUE); 24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (int i = 0; i < arraysize(test_data); ++i) { 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) finch_blacklist_registry_key.WriteValue(test_data[i].dll_name, 25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) test_data[i].dll_name); 25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestDll_AddDllsFromRegistryToBlacklist(); 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CheckBlacklistedDllsNotLoaded(); 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void TestResetBeacon(scoped_ptr<base::win::RegKey>& key, 258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DWORD input_state, 259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DWORD expected_output_state) { 260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LONG result = key->WriteValue(blacklist::kBeaconState, input_state); 261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, result); 262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(blacklist::ResetBeacon()); 264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX; 265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result = key->ReadValueDW(blacklist::kBeaconState, &blacklist_state); 266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, result); 267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected_output_state, blacklist_state); 268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(BlacklistTest, ResetBeacon) { 271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Ensure that ResetBeacon resets properly on successful runs and not on 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // failed or disabled runs. 273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestResetBeacon(blacklist_registry_key_, 274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::BLACKLIST_SETUP_RUNNING, 275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::BLACKLIST_ENABLED); 276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestResetBeacon(blacklist_registry_key_, 278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::BLACKLIST_SETUP_FAILED, 279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::BLACKLIST_SETUP_FAILED); 280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestResetBeacon(blacklist_registry_key_, 282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::BLACKLIST_DISABLED, 283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::BLACKLIST_DISABLED); 284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(BlacklistTest, SetupFailed) { 287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Ensure that when the number of failed tries reaches the maximum allowed, 288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // the blacklist state is set to failed. 289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LONG result = blacklist_registry_key_->WriteValue( 290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::kBeaconState, blacklist::BLACKLIST_SETUP_RUNNING); 291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, result); 292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Set the attempt count so that on the next failure the blacklist is 294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // disabled. 295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result = blacklist_registry_key_->WriteValue( 296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::kBeaconAttemptCount, blacklist::kBeaconMaxAttempts - 1); 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, result); 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(blacklist::LeaveSetupBeacon()); 300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DWORD attempt_count = 0; 302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist_registry_key_->ReadValueDW(blacklist::kBeaconAttemptCount, 303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &attempt_count); 304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(attempt_count, blacklist::kBeaconMaxAttempts); 305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX; 307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result = blacklist_registry_key_->ReadValueDW(blacklist::kBeaconState, 308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &blacklist_state); 309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, result); 310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(blacklist_state, blacklist::BLACKLIST_SETUP_FAILED); 311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(BlacklistTest, SetupSucceeded) { 314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Starting with the enabled beacon should result in the setup running state 315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // and the attempt counter reset to zero. 316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LONG result = blacklist_registry_key_->WriteValue( 317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::kBeaconState, blacklist::BLACKLIST_ENABLED); 318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, result); 319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result = blacklist_registry_key_->WriteValue(blacklist::kBeaconAttemptCount, 320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist::kBeaconMaxAttempts); 321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, result); 322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(blacklist::LeaveSetupBeacon()); 324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DWORD blacklist_state = blacklist::BLACKLIST_STATE_MAX; 326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist_registry_key_->ReadValueDW(blacklist::kBeaconState, 327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &blacklist_state); 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(blacklist_state, blacklist::BLACKLIST_SETUP_RUNNING); 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DWORD attempt_count = blacklist::kBeaconMaxAttempts; 331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blacklist_registry_key_->ReadValueDW(blacklist::kBeaconAttemptCount, 332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &attempt_count); 333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(static_cast<DWORD>(0), attempt_count); 334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 33646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace 337