Relax COFF string table check

COFF object files with 0 as string table size are currently rejected. This
prevents us from reading object files written by tools like cvtres that
violate the PECOFF spec and write 0 instead of 4 for the size of an empty
string table.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202292 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nico Rieck 2014-02-26 19:51:44 +00:00
parent 5732fbd6e4
commit 0a91f48308
3 changed files with 14 additions and 2 deletions

View File

@ -409,9 +409,13 @@ error_code COFFObjectFile::initSymbolTablePtr() {
getObject(StringTable, Data, StringTableAddr, StringTableSize))
return EC;
// Treat table sizes < 4 as empty because contrary to the PECOFF spec, some
// tools like cvtres write a size of 0 for an empty table instead of 4.
if (StringTableSize < 4)
StringTableSize = 4;
// Check that the string table is null terminated if has any in it.
if (StringTableSize < 4 ||
(StringTableSize > 4 && StringTable[StringTableSize - 1] != 0))
if (StringTableSize > 4 && StringTable[StringTableSize - 1] != 0)
return object_error::parse_failed;
return object_error::success;
}

View File

@ -0,0 +1,8 @@
Ensure that we can read COFF objects with a string table size of 0 (instead
of 4) for empty string tables.
RUN: llvm-readobj -t %p/Inputs/zero-string-table.obj.coff-i386 | FileCheck %s
CHECK: Symbols [
CHECK: Symbol {
CHECK: Name: $R000000