diff options
author | Nico Rieck <nico.rieck@gmail.com> | 2014-02-26 19:51:44 +0000 |
---|---|---|
committer | Nico Rieck <nico.rieck@gmail.com> | 2014-02-26 19:51:44 +0000 |
commit | 0a91f4830848ca16bf4b0569e45e23d7e8043368 (patch) | |
tree | 073d19ffcc7009dfd364d970f910395909cf646f | |
parent | 5732fbd6e4cd5d6e20f3bbded6549fa5c592562a (diff) | |
download | llvm-0a91f4830848ca16bf4b0569e45e23d7e8043368.tar.gz llvm-0a91f4830848ca16bf4b0569e45e23d7e8043368.tar.bz2 llvm-0a91f4830848ca16bf4b0569e45e23d7e8043368.tar.xz |
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
-rw-r--r-- | lib/Object/COFFObjectFile.cpp | 8 | ||||
-rw-r--r-- | test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386 | bin | 0 -> 704 bytes | |||
-rw-r--r-- | test/tools/llvm-readobj/coff-zero-string-table.test | 8 |
3 files changed, 14 insertions, 2 deletions
diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 41d21eed13..0c79506f41 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -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; } diff --git a/test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386 b/test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386 Binary files differnew file mode 100644 index 0000000000..f41f224f60 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386 diff --git a/test/tools/llvm-readobj/coff-zero-string-table.test b/test/tools/llvm-readobj/coff-zero-string-table.test new file mode 100644 index 0000000000..dfcf79e247 --- /dev/null +++ b/test/tools/llvm-readobj/coff-zero-string-table.test @@ -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 |