[llvm] r241070 - Report an error on invalid sh_entsize.
Rafael Espindola
rafael.espindola at gmail.com
Tue Jun 30 07:59:21 PDT 2015
Author: rafael
Date: Tue Jun 30 09:59:20 2015
New Revision: 241070
URL: http://llvm.org/viewvc/llvm-project?rev=241070&view=rev
Log:
Report an error on invalid sh_entsize.
Added:
llvm/trunk/test/Object/Inputs/invalid-sh_entsize.elf (with props)
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=241070&r1=241069&r2=241070&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELF.h (original)
+++ llvm/trunk/include/llvm/Object/ELF.h Tue Jun 30 09:59:20 2015
@@ -285,17 +285,18 @@ public:
}
const Elf_Sym *begin_dynamic_symbols() const {
- if (DynSymRegion.Addr)
- return reinterpret_cast<const Elf_Sym *>(DynSymRegion.Addr);
- return nullptr;
+ if (!DynSymRegion.Addr)
+ return nullptr;
+ if (DynSymRegion.EntSize != sizeof(Elf_Sym))
+ report_fatal_error("Invalid symbol size");
+ return reinterpret_cast<const Elf_Sym *>(DynSymRegion.Addr);
}
const Elf_Sym *end_dynamic_symbols() const {
- if (DynSymRegion.Addr)
- return reinterpret_cast<const Elf_Sym *>(
- ((const char *)DynSymRegion.Addr + DynSymRegion.Size));
-
- return nullptr;
+ if (!DynSymRegion.Addr)
+ return nullptr;
+ return reinterpret_cast<const Elf_Sym *>(
+ ((const char *)DynSymRegion.Addr + DynSymRegion.Size));
}
Elf_Sym_Range dynamic_symbols() const {
@@ -766,6 +767,8 @@ template <class ELFT>
const typename ELFFile<ELFT>::Elf_Sym *ELFFile<ELFT>::begin_symbols() const {
if (!dot_symtab_sec)
return nullptr;
+ if (dot_symtab_sec->sh_entsize != sizeof(Elf_Sym))
+ report_fatal_error("Invalid symbol size");
return reinterpret_cast<const Elf_Sym *>(base() + dot_symtab_sec->sh_offset);
}
Added: llvm/trunk/test/Object/Inputs/invalid-sh_entsize.elf
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/invalid-sh_entsize.elf?rev=241070&view=auto
==============================================================================
Binary files llvm/trunk/test/Object/Inputs/invalid-sh_entsize.elf (added) and llvm/trunk/test/Object/Inputs/invalid-sh_entsize.elf Tue Jun 30 09:59:20 2015 differ
Propchange: llvm/trunk/test/Object/Inputs/invalid-sh_entsize.elf
------------------------------------------------------------------------------
svn:executable = *
Modified: llvm/trunk/test/Object/invalid.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/invalid.test?rev=241070&r1=241069&r2=241070&view=diff
==============================================================================
--- llvm/trunk/test/Object/invalid.test (original)
+++ llvm/trunk/test/Object/invalid.test Tue Jun 30 09:59:20 2015
@@ -5,3 +5,35 @@ CHECK: Invalid data was encountered whil
RUN: not llvm-objdump -s %p/Inputs/invalid-strtab-non-null.elf 2>&1 | FileCheck --check-prefix=NON-NULL %s
NON-NULL: String table must end with a null terminator
+
+Test the sh_entsize are invalid
+RUN: llvm-readobj -s %p/Inputs/invalid-sh_entsize.elf | FileCheck --check-prefix=SECTION %s
+
+SECTION: Name: .dynsym
+SECTION-NEXT: Type: SHT_DYNSYM
+SECTION-NEXT: Flags [
+SECTION-NEXT: SHF_ALLOC
+SECTION-NEXT: ]
+SECTION-NEXT: Address:
+SECTION-NEXT: Offset:
+SECTION-NEXT: Size:
+SECTION-NEXT: Link:
+SECTION-NEXT: Info:
+SECTION-NEXT: AddressAlignment:
+SECTION-NEXT: EntrySize: 32
+
+SECTION: Name: .symtab
+SECTION-NEXT: Type: SHT_SYMTAB
+SECTION-NEXT: Flags [
+SECTION-NEXT: ]
+SECTION-NEXT: Address:
+SECTION-NEXT: Offset:
+SECTION-NEXT: Size:
+SECTION-NEXT: Link:
+SECTION-NEXT: Info:
+SECTION-NEXT: AddressAlignment:
+SECTION-NEXT: EntrySize: 32
+
+RUN: not llvm-readobj -t %p/Inputs/invalid-sh_entsize.elf 2>&1 | FileCheck --check-prefix=INVALID-SYM-SIZE %s
+RUN: not llvm-readobj --dyn-symbols %p/Inputs/invalid-sh_entsize.elf 2>&1 | FileCheck --check-prefix=INVALID-SYM-SIZE %s
+INVALID-SYM-SIZE: Invalid symbol size
More information about the llvm-commits
mailing list