forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add tests to make sure ChromeELF.dll imports are correct:
1. Make sure chrome_elf.dll imports nothing besides kernel32 and some msvc libs (DEBUG builds) 2. make sure chrome_elf.dll is always the first entry in chrome.exe's import table. Review URL: https://codereview.chromium.org/109483003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@242834 0039d316-1c4b-4281-b951-d872f2087c98
- Loading branch information
caitkp@chromium.org
committed
Jan 2, 2014
1 parent
161d87a
commit 863d866
Showing
2 changed files
with
95 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
// Copyright 2014 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 <stdint.h> | ||
#include <windows.h> | ||
|
||
#include <algorithm> | ||
#include <vector> | ||
|
||
#include "base/base_paths.h" | ||
#include "base/basictypes.h" | ||
#include "base/compiler_specific.h" | ||
#include "base/files/file_path.h" | ||
#include "base/files/memory_mapped_file.h" | ||
#include "base/path_service.h" | ||
#include "base/strings/string_util.h" | ||
#include "base/win/pe_image.h" | ||
#include "testing/gtest/include/gtest/gtest.h" | ||
|
||
namespace { | ||
|
||
class ELFImportsTest : public testing::Test { | ||
protected: | ||
static bool ImportsCallback(const base::win::PEImage &image, | ||
LPCSTR module, | ||
PIMAGE_THUNK_DATA name_table, | ||
PIMAGE_THUNK_DATA iat, | ||
PVOID cookie) { | ||
std::vector<std::string>* import_list = | ||
reinterpret_cast<std::vector<std::string>*>(cookie); | ||
import_list->push_back(module); | ||
return true; | ||
} | ||
|
||
void GetImports(const base::FilePath& module_path, | ||
std::vector<std::string>* imports) { | ||
|
||
ASSERT_TRUE(imports != NULL); | ||
|
||
base::MemoryMappedFile module_mmap; | ||
|
||
ASSERT_TRUE(module_mmap.Initialize(module_path)); | ||
base::win::PEImageAsData pe_image_data( | ||
reinterpret_cast<HMODULE>(const_cast<uint8*>(module_mmap.data()))); | ||
pe_image_data.EnumImportChunks(ELFImportsTest::ImportsCallback, imports); | ||
} | ||
}; | ||
|
||
TEST_F(ELFImportsTest, ChromeElfSanityCheck) { | ||
std::vector<std::string> elf_imports; | ||
|
||
base::FilePath dll; | ||
ASSERT_TRUE(PathService::Get(base::DIR_EXE, &dll)); | ||
dll = dll.Append(L"chrome_elf.dll"); | ||
GetImports(dll, &elf_imports); | ||
|
||
// Check that ELF has imports. | ||
ASSERT_LT(0u, elf_imports.size()); | ||
|
||
std::vector<std::string>::iterator it(elf_imports.begin()); | ||
|
||
static const char* const kValidFilePatterns[] = { | ||
"KERNEL32.dll", | ||
"MSVC*", | ||
"ADVAPI32.dll"}; | ||
|
||
// Make sure all of ELF's imports are in the valid imports list. | ||
for (; it != elf_imports.end(); it++) { | ||
bool match = false; | ||
for (int i = 0; i < arraysize(kValidFilePatterns); ++i) { | ||
if (MatchPattern(*it, kValidFilePatterns[i])) | ||
match = true; | ||
} | ||
ASSERT_TRUE(match) << "Illegal import in chrome_elf.dll."; | ||
} | ||
} | ||
|
||
TEST_F(ELFImportsTest, ChromeExeSanityCheck) { | ||
std::vector<std::string> exe_imports; | ||
|
||
base::FilePath exe; | ||
ASSERT_TRUE(PathService::Get(base::DIR_EXE, &exe)); | ||
exe = exe.Append(L"chrome.exe"); | ||
GetImports(exe, &exe_imports); | ||
|
||
// Check that chrome.exe has imports. | ||
ASSERT_LT(0u, exe_imports.size()); | ||
|
||
// Chrome.exe's first import must be ELF. | ||
EXPECT_EQ("chrome_elf.dll", exe_imports[0]); | ||
} | ||
|
||
} // namespace |