Recommit r284371 "[Object/ELF] - Check that e_shnum is null when e_shoff is."
authorGeorge Rimar <grimar@accesssoftek.com>
Mon, 17 Oct 2016 10:58:02 +0000 (10:58 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Mon, 17 Oct 2016 10:58:02 +0000 (10:58 +0000)
With fix: hex edited the precompiled inputs from another testcases to pass new checks.

Original commit message:

[Object/ELF] - Check that e_shnum is null when e_shoff is.

Spec says (http://www.sco.com/developers/gabi/1998-04-29/ch4.eheader.html) :
e_shnum
This member holds the number of entries in the section header table. Thus the product of e_shentsize and e_shnum gives the section header table's size in bytes. If a file has no section header table, e_shnum holds the value zero.

Revealed using "id_000037,sig_11,src_000015,op_havoc,rep_8" from PR30540

That was the reason of crash in lld on incorrect input file.
Binary reduced using afl-min.

Differential revision: https://reviews.llvm.org/D25090

llvm-svn: 284374

llvm/include/llvm/Object/ELF.h
llvm/test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64
llvm/test/Object/Inputs/invalid-e_shnum.elf [new file with mode: 0644]
llvm/test/Object/Inputs/rel-no-sec-table.elf-x86-64
llvm/test/Object/invalid.test

index 31f42f5..03b172f 100644 (file)
@@ -319,8 +319,12 @@ ELFFile<ELFT>::ELFFile(StringRef Object, std::error_code &EC)
 
   Header = reinterpret_cast<const Elf_Ehdr *>(base());
 
-  if (Header->e_shoff == 0)
+  if (Header->e_shoff == 0) {
+    if (Header->e_shnum != 0)
+      report_fatal_error(
+          "e_shnum should be zero if a file has no section header table");
     return;
+  }
 
   const uint64_t SectionTableOffset = Header->e_shoff;
 
index bdaa3cf..ab9a63e 100755 (executable)
Binary files a/llvm/test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64 and b/llvm/test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64 differ
diff --git a/llvm/test/Object/Inputs/invalid-e_shnum.elf b/llvm/test/Object/Inputs/invalid-e_shnum.elf
new file mode 100644 (file)
index 0000000..0b46fbd
Binary files /dev/null and b/llvm/test/Object/Inputs/invalid-e_shnum.elf differ
index d527305..33449c9 100755 (executable)
Binary files a/llvm/test/Object/Inputs/rel-no-sec-table.elf-x86-64 and b/llvm/test/Object/Inputs/rel-no-sec-table.elf-x86-64 differ
index d940789..c72de06 100644 (file)
@@ -55,6 +55,9 @@ INVALID-SYMTAB-SIZE: Invalid data was encountered while parsing the file
 RUN: not llvm-readobj -t %p/Inputs/invalid-xindex-size.elf 2>&1 | FileCheck --check-prefix=INVALID-XINDEX-SIZE %s
 INVALID-XINDEX-SIZE: Invalid data was encountered while parsing the file.
 
+RUN: not llvm-readobj -t %p/Inputs/invalid-e_shnum.elf 2>&1 | FileCheck --check-prefix=INVALID-SH-NUM %s
+INVALID-SH-NUM: e_shnum should be zero if a file has no section header table
+
 RUN: not llvm-readobj -t %p/Inputs/invalid-ext-symtab-index.elf-x86-64 2>&1 | \
 RUN:   FileCheck --check-prefix=INVALID-EXT-SYMTAB-INDEX %s
 INVALID-EXT-SYMTAB-INDEX: Invalid symbol table index