mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-31 01:43:03 +08:00
win: Don't attempt to read a nonexistent IMAGE_DIRECTORY_ENTRY_DEBUG
BUG=crashpad:1 R=scottmg@chromium.org Review URL: https://codereview.chromium.org/1411123011 .
This commit is contained in:
parent
ba0e7de07b
commit
ad9887ee0d
@ -143,11 +143,20 @@ template <class NtHeadersType>
|
|||||||
bool PEImageReader::ReadDebugDirectoryInformation(UUID* uuid,
|
bool PEImageReader::ReadDebugDirectoryInformation(UUID* uuid,
|
||||||
DWORD* age,
|
DWORD* age,
|
||||||
std::string* pdbname) const {
|
std::string* pdbname) const {
|
||||||
WinVMAddress nt_headers_address;
|
|
||||||
NtHeadersType nt_headers;
|
NtHeadersType nt_headers;
|
||||||
if (!ReadNtHeaders(&nt_headers_address, &nt_headers))
|
if (!ReadNtHeaders(&nt_headers, nullptr))
|
||||||
return false;
|
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 =
|
const IMAGE_DATA_DIRECTORY& data_directory =
|
||||||
nt_headers.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
|
nt_headers.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
|
||||||
if (data_directory.VirtualAddress == 0 || data_directory.Size == 0)
|
if (data_directory.VirtualAddress == 0 || data_directory.Size == 0)
|
||||||
@ -202,8 +211,8 @@ bool PEImageReader::ReadDebugDirectoryInformation(UUID* uuid,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class NtHeadersType>
|
template <class NtHeadersType>
|
||||||
bool PEImageReader::ReadNtHeaders(WinVMAddress* nt_headers_address,
|
bool PEImageReader::ReadNtHeaders(NtHeadersType* nt_headers,
|
||||||
NtHeadersType* nt_headers) const {
|
WinVMAddress* nt_headers_address) const {
|
||||||
IMAGE_DOS_HEADER dos_header;
|
IMAGE_DOS_HEADER dos_header;
|
||||||
if (!CheckedReadMemory(Address(), sizeof(IMAGE_DOS_HEADER), &dos_header)) {
|
if (!CheckedReadMemory(Address(), sizeof(IMAGE_DOS_HEADER), &dos_header)) {
|
||||||
LOG(WARNING) << "could not read dos header of " << module_name_;
|
LOG(WARNING) << "could not read dos header of " << module_name_;
|
||||||
@ -215,9 +224,9 @@ bool PEImageReader::ReadNtHeaders(WinVMAddress* nt_headers_address,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*nt_headers_address = Address() + dos_header.e_lfanew;
|
WinVMAddress local_nt_headers_address = Address() + dos_header.e_lfanew;
|
||||||
if (!CheckedReadMemory(
|
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_;
|
LOG(WARNING) << "could not read nt headers of " << module_name_;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -227,6 +236,9 @@ bool PEImageReader::ReadNtHeaders(WinVMAddress* nt_headers_address,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nt_headers_address)
|
||||||
|
*nt_headers_address = local_nt_headers_address;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,9 +250,9 @@ bool PEImageReader::GetSectionByName(const std::string& name,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
WinVMAddress nt_headers_address;
|
|
||||||
NtHeadersType nt_headers;
|
NtHeadersType nt_headers;
|
||||||
if (!ReadNtHeaders(&nt_headers_address, &nt_headers))
|
WinVMAddress nt_headers_address;
|
||||||
|
if (!ReadNtHeaders(&nt_headers, &nt_headers_address))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
WinVMAddress first_section_address =
|
WinVMAddress first_section_address =
|
||||||
|
@ -109,15 +109,30 @@ class PEImageReader {
|
|||||||
private:
|
private:
|
||||||
//! \brief Implementation helper for DebugDirectoryInformation() templated by
|
//! \brief Implementation helper for DebugDirectoryInformation() templated by
|
||||||
//! `IMAGE_NT_HEADERS` type for different bitnesses.
|
//! `IMAGE_NT_HEADERS` type for different bitnesses.
|
||||||
|
//!
|
||||||
|
//! \return `true` on success, with the parameters set appropriately. `false`
|
||||||
|
//! on failure. This method may return `false` without logging anything in
|
||||||
|
//! the case of a module that does not contain relevant debugging
|
||||||
|
//! information but is otherwise properly structured.
|
||||||
template <class NtHeadersType>
|
template <class NtHeadersType>
|
||||||
bool ReadDebugDirectoryInformation(UUID* uuid,
|
bool ReadDebugDirectoryInformation(UUID* uuid,
|
||||||
DWORD* age,
|
DWORD* age,
|
||||||
std::string* pdbname) const;
|
std::string* pdbname) const;
|
||||||
|
|
||||||
//! \brief Reads the `IMAGE_NT_HEADERS` from the beginning of the image.
|
//! \brief Reads the `IMAGE_NT_HEADERS` from the beginning of the image.
|
||||||
|
//!
|
||||||
|
//! \param[out] nt_headers The contents of the templated NtHeadersType
|
||||||
|
//! structure read from the remote process.
|
||||||
|
//! \param[out] nt_headers_address The address of the templated NtHeadersType
|
||||||
|
//! structure in the remote process’ address space. If this information is
|
||||||
|
//! not needed, this parameter may be `nullptr`.
|
||||||
|
//!
|
||||||
|
//! \return `true` on success, with \a nt_headers and optionally \a
|
||||||
|
//! nt_headers_address set appropriately. `false` on failure, with a
|
||||||
|
//! message logged.
|
||||||
template <class NtHeadersType>
|
template <class NtHeadersType>
|
||||||
bool ReadNtHeaders(WinVMAddress* nt_header_address,
|
bool ReadNtHeaders(NtHeadersType* nt_headers,
|
||||||
NtHeadersType* nt_headers) const;
|
WinVMAddress* nt_headers_address) const;
|
||||||
|
|
||||||
//! \brief Finds a given section by name in the image.
|
//! \brief Finds a given section by name in the image.
|
||||||
template <class NtHeadersType>
|
template <class NtHeadersType>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user