[Object/ELF] - Avoid possible crash in getExtendedSymbolTableIndex().
authorGeorge Rimar <grimar@accesssoftek.com>
Tue, 4 Oct 2016 08:44:03 +0000 (08:44 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Tue, 4 Oct 2016 08:44:03 +0000 (08:44 +0000)
When using broken input object found using AFL,
getExtendedSymbolTableIndex() crashed because ShndxTable
was empty as object does not contain SHT_SYMTAB_SHNDX section.

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

llvm-svn: 283196

llvm/include/llvm/Object/ELF.h
llvm/test/Object/Inputs/invalid-ext-symtab-index.elf-x86-64 [new file with mode: 0644]
llvm/test/Object/invalid.test

index 80b8be0..b08b427 100644 (file)
@@ -225,7 +225,8 @@ uint32_t ELFFile<ELFT>::getExtendedSymbolTableIndex(
     ArrayRef<Elf_Word> ShndxTable) const {
   assert(Sym->st_shndx == ELF::SHN_XINDEX);
   unsigned Index = Sym - FirstSym;
-
+  if (Index >= ShndxTable.size())
+    report_fatal_error("Invalid symbol table index");
   // The size of the table was checked in getSHNDXTable.
   return ShndxTable[Index];
 }
diff --git a/llvm/test/Object/Inputs/invalid-ext-symtab-index.elf-x86-64 b/llvm/test/Object/Inputs/invalid-ext-symtab-index.elf-x86-64
new file mode 100644 (file)
index 0000000..00ec5a5
Binary files /dev/null and b/llvm/test/Object/Inputs/invalid-ext-symtab-index.elf-x86-64 differ
index a32c621..e19583d 100644 (file)
@@ -54,3 +54,7 @@ INVALID-SYMTAB-SIZE: Invalid symbol table size
 
 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-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