[llvm] r245873 - Report an error if a SHT_SYMTAB_SHNDX section has the wrong size.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 24 14:09:41 PDT 2015


Author: rafael
Date: Mon Aug 24 16:09:41 2015
New Revision: 245873

URL: http://llvm.org/viewvc/llvm-project?rev=245873&view=rev
Log:
Report an error if a SHT_SYMTAB_SHNDX section has the wrong size.

Added:
    llvm/trunk/test/Object/Inputs/invalid-xindex-size.elf
Modified:
    llvm/trunk/include/llvm/Object/ELF.h
    llvm/trunk/test/Object/invalid.test

Modified: llvm/trunk/include/llvm/Object/ELF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF.h?rev=245873&r1=245872&r2=245873&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELF.h (original)
+++ llvm/trunk/include/llvm/Object/ELF.h Mon Aug 24 16:09:41 2015
@@ -197,9 +197,9 @@ public:
 
   uint64_t getNumSections() const;
   uintX_t getStringTableIndex() const;
-  ELF::Elf64_Word
-  getExtendedSymbolTableIndex(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
-                              ArrayRef<Elf_Word> ShndxTable) const;
+  uint32_t getExtendedSymbolTableIndex(const Elf_Sym *Sym,
+                                       const Elf_Shdr *SymTab,
+                                       ArrayRef<Elf_Word> ShndxTable) const;
   const Elf_Ehdr *getHeader() const { return Header; }
   ErrorOr<const Elf_Shdr *> getSection(const Elf_Sym *Sym,
                                        const Elf_Shdr *SymTab,
@@ -220,13 +220,13 @@ typedef ELFFile<ELFType<support::big, fa
 typedef ELFFile<ELFType<support::big, true>> ELF64BEFile;
 
 template <class ELFT>
-ELF::Elf64_Word ELFFile<ELFT>::getExtendedSymbolTableIndex(
+uint32_t ELFFile<ELFT>::getExtendedSymbolTableIndex(
     const Elf_Sym *Sym, const Elf_Shdr *SymTab,
     ArrayRef<Elf_Word> ShndxTable) const {
   assert(Sym->st_shndx == ELF::SHN_XINDEX);
   unsigned Index = Sym - symbol_begin(SymTab);
 
-  // FIXME: error checking
+  // The size of the table was checked in getSHNDXTable.
   return ShndxTable[Index];
 }
 
@@ -471,12 +471,22 @@ ELFFile<ELFT>::getSHNDXTable(const Elf_S
   assert(Section.sh_type == ELF::SHT_SYMTAB_SHNDX);
   const Elf_Word *ShndxTableBegin =
       reinterpret_cast<const Elf_Word *>(base() + Section.sh_offset);
-  uintX_t Size = Section.sh_offset;
-  if (Size % sizeof(uintX_t))
+  uintX_t Size = Section.sh_size;
+  if (Size % sizeof(uint32_t))
     return object_error::parse_failed;
-  const Elf_Word *ShndxTableEnd = ShndxTableBegin + Size / sizeof(uintX_t);
+  uintX_t NumSymbols = Size / sizeof(uint32_t);
+  const Elf_Word *ShndxTableEnd = ShndxTableBegin + NumSymbols;
   if (reinterpret_cast<const char *>(ShndxTableEnd) > Buf.end())
     return object_error::parse_failed;
+  ErrorOr<const Elf_Shdr *> SymTableOrErr = getSection(Section.sh_link);
+  if (std::error_code EC = SymTableOrErr.getError())
+    return EC;
+  const Elf_Shdr &SymTable = **SymTableOrErr;
+  if (SymTable.sh_type != ELF::SHT_SYMTAB &&
+      SymTable.sh_type != ELF::SHT_DYNSYM)
+    return object_error::parse_failed;
+  if (NumSymbols != (SymTable.sh_size / sizeof(Elf_Sym)))
+    return object_error::parse_failed;
   return ArrayRef<Elf_Word>(ShndxTableBegin, ShndxTableEnd);
 }
 

Added: llvm/trunk/test/Object/Inputs/invalid-xindex-size.elf
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/invalid-xindex-size.elf?rev=245873&view=auto
==============================================================================
Binary files llvm/trunk/test/Object/Inputs/invalid-xindex-size.elf (added) and llvm/trunk/test/Object/Inputs/invalid-xindex-size.elf Mon Aug 24 16:09:41 2015 differ

Modified: llvm/trunk/test/Object/invalid.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/invalid.test?rev=245873&r1=245872&r2=245873&view=diff
==============================================================================
--- llvm/trunk/test/Object/invalid.test (original)
+++ llvm/trunk/test/Object/invalid.test Mon Aug 24 16:09:41 2015
@@ -48,3 +48,7 @@ INVALID-SECTION-SIZE: Invalid section he
 
 RUN: not llvm-readobj -t %p/Inputs/invalid-symbol-table-size.elf 2>&1 | FileCheck --check-prefix=INVALID-SYMTAB-SIZE %s
 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.




More information about the llvm-commits mailing list