summaryrefslogtreecommitdiff
path: root/lib/Object/COFFObjectFile.cpp
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2013-07-18 23:15:50 +0000
committerRui Ueyama <ruiu@google.com>2013-07-18 23:15:50 +0000
commit9d1359453fc5db2ff9fb334fe205a14c30ed244d (patch)
treeebadcfa3caef0171b73c5689b73178a8cda6dd74 /lib/Object/COFFObjectFile.cpp
parentcf2ab764db006078856312d9cfdf29d8fe59c3dd (diff)
downloadllvm-9d1359453fc5db2ff9fb334fe205a14c30ed244d.tar.gz
llvm-9d1359453fc5db2ff9fb334fe205a14c30ed244d.tar.bz2
llvm-9d1359453fc5db2ff9fb334fe205a14c30ed244d.tar.xz
Revert "COFFDumper: Dump data directory entries."
Because it broke s390x and ppc64-linux buildbots. This reverts commit r186623. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186627 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Object/COFFObjectFile.cpp')
-rw-r--r--lib/Object/COFFObjectFile.cpp82
1 files changed, 36 insertions, 46 deletions
diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp
index c66a1e044b..49317e9051 100644
--- a/lib/Object/COFFObjectFile.cpp
+++ b/lib/Object/COFFObjectFile.cpp
@@ -37,19 +37,18 @@ bool checkSize(const MemoryBuffer *m, error_code &ec, uint64_t size) {
return true;
}
-// Sets Obj unless any bytes in [addr, addr + size) fall outsize of m.
-// Returns unexpected_eof if error.
-template<typename T>
-error_code getObject(const T *&Obj, const MemoryBuffer *M, const uint8_t *Ptr,
- const size_t Size = sizeof(T)) {
- uintptr_t Addr = uintptr_t(Ptr);
- if (Addr + Size < Addr ||
- Addr + Size < Size ||
- Addr + Size > uintptr_t(M->getBufferEnd())) {
- return object_error::unexpected_eof;
+// Returns false if any bytes in [addr, addr + size) fall outsize of m.
+bool checkAddr(const MemoryBuffer *m,
+ error_code &ec,
+ uintptr_t addr,
+ uint64_t size) {
+ if (addr + size < addr ||
+ addr + size < size ||
+ addr + size > uintptr_t(m->getBufferEnd())) {
+ ec = object_error::unexpected_eof;
+ return false;
}
- Obj = reinterpret_cast<const T *>(Addr);
- return object_error::success;
+ return true;
}
}
@@ -433,7 +432,6 @@ COFFObjectFile::COFFObjectFile(MemoryBuffer *Object, error_code &ec)
: ObjectFile(Binary::ID_COFF, Object)
, COFFHeader(0)
, PE32Header(0)
- , DataDirectory(0)
, SectionTable(0)
, SymbolTable(0)
, StringTable(0)
@@ -463,47 +461,48 @@ COFFObjectFile::COFFObjectFile(MemoryBuffer *Object, error_code &ec)
hasPEHeader = true;
}
- if ((ec = getObject(COFFHeader, Data, base() + CurPtr)))
+ COFFHeader = reinterpret_cast<const coff_file_header *>(base() + CurPtr);
+ if (!checkAddr(Data, ec, uintptr_t(COFFHeader), sizeof(coff_file_header)))
return;
CurPtr += sizeof(coff_file_header);
if (hasPEHeader) {
- if ((ec = getObject(PE32Header, Data, base() + CurPtr)))
+ PE32Header = reinterpret_cast<const pe32_header *>(base() + CurPtr);
+ if (!checkAddr(Data, ec, uintptr_t(PE32Header), sizeof(pe32_header)))
return;
- if (PE32Header->Magic != 0x10b) {
- // We only support PE32. If this is PE32 (not PE32+), the magic byte
- // should be 0x10b. If this is not PE32, continue as if there's no PE
- // header in this file.
+ // We only support PE32. If this is PE32 (not PE32+), the magic byte
+ // should be 0x10b. If this is not PE32, continue as if there's no PE
+ // header in this file.
+ if (PE32Header->Magic != 0x10b)
PE32Header = 0;
- } else if (PE32Header->NumberOfRvaAndSize > 0) {
- const uint8_t *addr = base() + CurPtr + sizeof(pe32_header);
- uint64_t size = sizeof(data_directory) * PE32Header->NumberOfRvaAndSize;
- if ((ec = getObject(DataDirectory, Data, addr, size)))
- return;
- }
+ // There may be optional data directory after PE header. Skip them.
CurPtr += COFFHeader->SizeOfOptionalHeader;
}
- if ((ec = getObject(SectionTable, Data, base() + CurPtr,
- COFFHeader->NumberOfSections * sizeof(coff_section))))
+ SectionTable =
+ reinterpret_cast<const coff_section *>(base() + CurPtr);
+ if (!checkAddr(Data, ec, uintptr_t(SectionTable),
+ COFFHeader->NumberOfSections * sizeof(coff_section)))
return;
if (COFFHeader->PointerToSymbolTable != 0) {
- if ((ec = getObject(SymbolTable, Data,
- base() + COFFHeader->PointerToSymbolTable,
- COFFHeader->NumberOfSymbols * sizeof(coff_symbol))))
+ SymbolTable =
+ reinterpret_cast<const coff_symbol *>(base()
+ + COFFHeader->PointerToSymbolTable);
+ if (!checkAddr(Data, ec, uintptr_t(SymbolTable),
+ COFFHeader->NumberOfSymbols * sizeof(coff_symbol)))
return;
// Find string table.
- const uint8_t *StringTableAddr = base() + COFFHeader->PointerToSymbolTable
- + COFFHeader->NumberOfSymbols * sizeof(coff_symbol);
- const uint32_t *StringTableSizePtr;
- if ((ec = getObject(StringTableSizePtr, Data, StringTableAddr)))
- return;
- StringTableSize = *StringTableSizePtr;
- if ((ec = getObject(StringTable, Data, StringTableAddr, StringTableSize)))
+ StringTable = reinterpret_cast<const char *>(base())
+ + COFFHeader->PointerToSymbolTable
+ + COFFHeader->NumberOfSymbols * sizeof(coff_symbol);
+ if (!checkAddr(Data, ec, uintptr_t(StringTable), sizeof(ulittle32_t)))
return;
+ StringTableSize = *reinterpret_cast<const ulittle32_t *>(StringTable);
+ if (!checkAddr(Data, ec, uintptr_t(StringTable), StringTableSize))
+ return;
// Check that the string table is null terminated if has any in it.
if (StringTableSize < 4
|| (StringTableSize > 4 && StringTable[StringTableSize - 1] != 0)) {
@@ -608,15 +607,6 @@ error_code COFFObjectFile::getPE32Header(const pe32_header *&Res) const {
return object_error::success;
}
-error_code COFFObjectFile::getDataDirectory(uint32_t index,
- const data_directory *&Res) const {
- // Error if if there's no data directory or the index is out of range.
- if (!DataDirectory || index > PE32Header->NumberOfRvaAndSize)
- return object_error::parse_failed;
- Res = &DataDirectory[index];
- return object_error::success;
-}
-
error_code COFFObjectFile::getSection(int32_t index,
const coff_section *&Result) const {
// Check for special index values.