Relax COFF string table check
authorNico Rieck <nico.rieck@gmail.com>
Wed, 26 Feb 2014 19:51:44 +0000 (19:51 +0000)
committerNico Rieck <nico.rieck@gmail.com>
Wed, 26 Feb 2014 19:51:44 +0000 (19:51 +0000)
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

lib/Object/COFFObjectFile.cpp
test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386 [new file with mode: 0644]
test/tools/llvm-readobj/coff-zero-string-table.test [new file with mode: 0644]

index 41d21eed13931e7baa83e226d109e2c761ef3648..0c79506f4190ad371428f1696403d5d2cf9a1843 100644 (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;
 }
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
new file mode 100644 (file)
index 0000000..f41f224
Binary files /dev/null and b/test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386 differ
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 (file)
index 0000000..dfcf79e
--- /dev/null
@@ -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