| Index: snapshot/win/pe_image_reader.cc
|
| diff --git a/snapshot/win/pe_image_reader.cc b/snapshot/win/pe_image_reader.cc
|
| index 7268358a056eaedd1091a76ca939ecac0e00db23..6f5bb61086cfb930b79c4fab9c9f8ea5eb83a996 100644
|
| --- a/snapshot/win/pe_image_reader.cc
|
| +++ b/snapshot/win/pe_image_reader.cc
|
| @@ -143,10 +143,19 @@ template <class NtHeadersType>
|
| bool PEImageReader::ReadDebugDirectoryInformation(UUID* uuid,
|
| DWORD* age,
|
| std::string* pdbname) const {
|
| - WinVMAddress nt_headers_address;
|
| NtHeadersType nt_headers;
|
| - if (!ReadNtHeaders(&nt_headers_address, &nt_headers))
|
| + if (!ReadNtHeaders(&nt_headers, nullptr))
|
| + return false;
|
| +
|
| + if (nt_headers.FileHeader.SizeOfOptionalHeader <
|
| + offsetof(decltype(nt_headers.OptionalHeader),
|
| + DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG]) +
|
| + sizeof(nt_headers.OptionalHeader
|
| + .DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG]) ||
|
| + nt_headers.OptionalHeader.NumberOfRvaAndSizes <=
|
| + IMAGE_DIRECTORY_ENTRY_DEBUG) {
|
| return false;
|
| + }
|
|
|
| const IMAGE_DATA_DIRECTORY& data_directory =
|
| nt_headers.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
|
| @@ -202,8 +211,8 @@ bool PEImageReader::ReadDebugDirectoryInformation(UUID* uuid,
|
| }
|
|
|
| template <class NtHeadersType>
|
| -bool PEImageReader::ReadNtHeaders(WinVMAddress* nt_headers_address,
|
| - NtHeadersType* nt_headers) const {
|
| +bool PEImageReader::ReadNtHeaders(NtHeadersType* nt_headers,
|
| + WinVMAddress* nt_headers_address) const {
|
| IMAGE_DOS_HEADER dos_header;
|
| if (!CheckedReadMemory(Address(), sizeof(IMAGE_DOS_HEADER), &dos_header)) {
|
| LOG(WARNING) << "could not read dos header of " << module_name_;
|
| @@ -215,9 +224,9 @@ bool PEImageReader::ReadNtHeaders(WinVMAddress* nt_headers_address,
|
| return false;
|
| }
|
|
|
| - *nt_headers_address = Address() + dos_header.e_lfanew;
|
| + WinVMAddress local_nt_headers_address = Address() + dos_header.e_lfanew;
|
| if (!CheckedReadMemory(
|
| - *nt_headers_address, sizeof(NtHeadersType), nt_headers)) {
|
| + local_nt_headers_address, sizeof(NtHeadersType), nt_headers)) {
|
| LOG(WARNING) << "could not read nt headers of " << module_name_;
|
| return false;
|
| }
|
| @@ -227,6 +236,9 @@ bool PEImageReader::ReadNtHeaders(WinVMAddress* nt_headers_address,
|
| return false;
|
| }
|
|
|
| + if (nt_headers_address)
|
| + *nt_headers_address = local_nt_headers_address;
|
| +
|
| return true;
|
| }
|
|
|
| @@ -238,9 +250,9 @@ bool PEImageReader::GetSectionByName(const std::string& name,
|
| return false;
|
| }
|
|
|
| - WinVMAddress nt_headers_address;
|
| NtHeadersType nt_headers;
|
| - if (!ReadNtHeaders(&nt_headers_address, &nt_headers))
|
| + WinVMAddress nt_headers_address;
|
| + if (!ReadNtHeaders(&nt_headers, &nt_headers_address))
|
| return false;
|
|
|
| WinVMAddress first_section_address =
|
|
|