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..486bb6d4de236e8d335ab52e850cc2e08e42e8dc 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(nullptr, &nt_headers)) |
+ 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]; |
@@ -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; |
} |