[LLDB] [PECOFF] Fix error handling for executables that object::createBinary errors out on

llvm::object::createBinary returns an Expected<>, which requires
not only checking the object for success, but also requires consuming
the Error, if one was set.

Use LLDB_LOG_ERROR for this case, and change an existing similar log
statement to use it as well, to make sure the Error is consumed even
if the log channel is disabled.

Differential Revision: https://reviews.llvm.org/D69646
This commit is contained in:
Martin Storsjö 2019-10-30 23:57:40 +02:00
parent a42967f63c
commit 3db1d138b1
2 changed files with 90 additions and 6 deletions

View File

@ -167,9 +167,15 @@ size_t ObjectFilePECOFF::GetModuleSpecifications(
if (!data_sp || !ObjectFilePECOFF::MagicBytesMatch(data_sp))
return initial_count;
Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT));
auto binary = llvm::object::createBinary(file.GetPath());
if (!binary)
if (!binary) {
LLDB_LOG_ERROR(log, binary.takeError(),
"Failed to create binary for file ({1}): {0}", file);
return initial_count;
}
if (!binary->getBinary()->isCOFF() &&
!binary->getBinary()->isCOFFImportFile())
@ -242,11 +248,8 @@ bool ObjectFilePECOFF::CreateBinary() {
auto binary = llvm::object::createBinary(m_file.GetPath());
if (!binary) {
LLDB_LOGF(log,
"ObjectFilePECOFF::CreateBinary() - failed to create binary "
"for file (%s): %s",
m_file ? m_file.GetPath().c_str() : "<NULL>",
errorToErrorCode(binary.takeError()).message().c_str());
LLDB_LOG_ERROR(log, binary.takeError(),
"Failed to create binary for file ({1}): {0}", m_file);
return false;
}

View File

@ -0,0 +1,81 @@
## Test that errors in loading an exe doesn't crash lldb.
## The ExportTable RelativeVirtualAddress is out of bounds here.
# RUN: yaml2obj %s > %t.exe
# RUN: %lldb %t.exe 2>&1 | FileCheck %s
# CHECK: error: '{{.*}}' doesn't contain any {{.*}} platform architectures
--- !COFF
OptionalHeader:
AddressOfEntryPoint: 4096
ImageBase: 1073741824
SectionAlignment: 4096
FileAlignment: 512
MajorOperatingSystemVersion: 6
MinorOperatingSystemVersion: 0
MajorImageVersion: 0
MinorImageVersion: 0
MajorSubsystemVersion: 6
MinorSubsystemVersion: 0
Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
SizeOfStackReserve: 1048576
SizeOfStackCommit: 4096
SizeOfHeapReserve: 1048576
SizeOfHeapCommit: 4096
ExportTable:
RelativeVirtualAddress: 12345678
Size: 100
ImportTable:
RelativeVirtualAddress: 0
Size: 0
ResourceTable:
RelativeVirtualAddress: 0
Size: 0
ExceptionTable:
RelativeVirtualAddress: 0
Size: 0
CertificateTable:
RelativeVirtualAddress: 0
Size: 0
BaseRelocationTable:
RelativeVirtualAddress: 0
Size: 0
Debug:
RelativeVirtualAddress: 0
Size: 0
Architecture:
RelativeVirtualAddress: 0
Size: 0
GlobalPtr:
RelativeVirtualAddress: 0
Size: 0
TlsTable:
RelativeVirtualAddress: 0
Size: 0
LoadConfigTable:
RelativeVirtualAddress: 0
Size: 0
BoundImport:
RelativeVirtualAddress: 0
Size: 0
IAT:
RelativeVirtualAddress: 0
Size: 0
DelayImportDescriptor:
RelativeVirtualAddress: 0
Size: 0
ClrRuntimeHeader:
RelativeVirtualAddress: 0
Size: 0
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE ]
sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
VirtualAddress: 4096
VirtualSize: 1
SectionData: C3
symbols: []
...