diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-06-26 04:36:32 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-06-26 04:36:32 +0000 |
commit | ad7b7e73a531dd53e2b7da62186f1479e4a6eac8 (patch) | |
tree | 3424a249e32eccfdda5b7428b381bde68a98bbfb /llvm/lib/Object/COFFObjectFile.cpp | |
parent | 861a19c294e257e9be59c814298016e2d3b7a842 (diff) | |
download | bcm5719-llvm-ad7b7e73a531dd53e2b7da62186f1479e4a6eac8.tar.gz bcm5719-llvm-ad7b7e73a531dd53e2b7da62186f1479e4a6eac8.zip |
[Object, COFF] An import data directory might not consist soley of imports
The last import is the penultimate entry, the last entry is nulled out.
Data beyond the null entry should not be considered to hold import
entries.
This fixes PR28302.
N.B. I am working on a reduced testcase, the one in PR28302 is too
large.
llvm-svn: 273790
Diffstat (limited to 'llvm/lib/Object/COFFObjectFile.cpp')
-rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index 878b93fcda0..0f790086cfc 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -529,15 +529,14 @@ std::error_code COFFObjectFile::initImportTablePtr() { return std::error_code(); uint32_t ImportTableRva = DataEntry->RelativeVirtualAddress; - // -1 because the last entry is the null entry. - NumberOfImportDirectory = DataEntry->Size / - sizeof(import_directory_table_entry) - 1; // Find the section that contains the RVA. This is needed because the RVA is // the import table's memory address which is different from its file offset. uintptr_t IntPtr = 0; if (std::error_code EC = getRvaPtr(ImportTableRva, IntPtr)) return EC; + if (std::error_code EC = checkOffset(Data, IntPtr, DataEntry->Size)) + return EC; ImportDirectory = reinterpret_cast< const import_directory_table_entry *>(IntPtr); return std::error_code(); @@ -631,7 +630,7 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC) COFFBigObjHeader(nullptr), PE32Header(nullptr), PE32PlusHeader(nullptr), DataDirectory(nullptr), SectionTable(nullptr), SymbolTable16(nullptr), SymbolTable32(nullptr), StringTable(nullptr), StringTableSize(0), - ImportDirectory(nullptr), NumberOfImportDirectory(0), + ImportDirectory(nullptr), DelayImportDirectory(nullptr), NumberOfDelayImportDirectory(0), ExportDirectory(nullptr), BaseRelocHeader(nullptr), BaseRelocEnd(nullptr), DebugDirectoryBegin(nullptr), DebugDirectoryEnd(nullptr) { @@ -771,13 +770,17 @@ basic_symbol_iterator COFFObjectFile::symbol_end_impl() const { } import_directory_iterator COFFObjectFile::import_directory_begin() const { + if (!ImportDirectory) + return import_directory_end(); + if (ImportDirectory[0].ImportLookupTableRVA == 0) + return import_directory_end(); return import_directory_iterator( ImportDirectoryEntryRef(ImportDirectory, 0, this)); } import_directory_iterator COFFObjectFile::import_directory_end() const { return import_directory_iterator( - ImportDirectoryEntryRef(ImportDirectory, NumberOfImportDirectory, this)); + ImportDirectoryEntryRef(nullptr, -1, this)); } delay_import_directory_iterator @@ -1198,12 +1201,15 @@ operator==(const ImportDirectoryEntryRef &Other) const { void ImportDirectoryEntryRef::moveNext() { ++Index; + if (ImportTable[Index].ImportLookupTableRVA == 0) { + Index = -1; + ImportTable = nullptr; + } } std::error_code ImportDirectoryEntryRef::getImportTableEntry( const import_directory_table_entry *&Result) const { - Result = ImportTable + Index; - return std::error_code(); + return getObject(Result, OwningObject->Data, ImportTable + Index); } static imported_symbol_iterator @@ -1280,16 +1286,6 @@ ImportDirectoryEntryRef::getImportAddressTableRVA(uint32_t &Result) const { return std::error_code(); } -std::error_code ImportDirectoryEntryRef::getImportLookupEntry( - const import_lookup_table_entry32 *&Result) const { - uintptr_t IntPtr = 0; - uint32_t RVA = ImportTable[Index].ImportLookupTableRVA; - if (std::error_code EC = OwningObject->getRvaPtr(RVA, IntPtr)) - return EC; - Result = reinterpret_cast<const import_lookup_table_entry32 *>(IntPtr); - return std::error_code(); -} - bool DelayImportDirectoryEntryRef:: operator==(const DelayImportDirectoryEntryRef &Other) const { return Table == Other.Table && Index == Other.Index; @@ -1473,6 +1469,22 @@ ImportedSymbolRef::getSymbolName(StringRef &Result) const { return std::error_code(); } +std::error_code ImportedSymbolRef::isOrdinal(bool &Result) const { + if (Entry32) + Result = Entry32[Index].isOrdinal(); + else + Result = Entry64[Index].isOrdinal(); + return std::error_code(); +} + +std::error_code ImportedSymbolRef::getHintNameRVA(uint32_t &Result) const { + if (Entry32) + Result = Entry32[Index].getHintNameRVA(); + else + Result = Entry64[Index].getHintNameRVA(); + return std::error_code(); +} + std::error_code ImportedSymbolRef::getOrdinal(uint16_t &Result) const { uint32_t RVA; if (Entry32) { |