From a95022a4f375f052546c9cff1c3f91b88ee5e1b5 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 23 Jul 2015 03:24:22 +0000 Subject: [PATCH] Refactor duplicated code and check for invalid symbol table size. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242981 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELF.h | 61 +++++++----------- .../Inputs/invalid-symbol-table-size.elf | Bin 0 -> 536 bytes test/Object/invalid.test | 4 ++ 3 files changed, 28 insertions(+), 37 deletions(-) create mode 100755 test/Object/Inputs/invalid-symbol-table-size.elf diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 0b671af070b..22d14db4c13 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -179,30 +179,34 @@ public: return make_range(section_begin(), section_end()); } - const Elf_Sym *symbol_begin() const; - const Elf_Sym *symbol_end() const; - Elf_Sym_Range symbols() const { - return make_range(symbol_begin(), symbol_end()); + const Elf_Sym *symbol_begin(const Elf_Shdr *Sec) const { + if (!Sec) + return nullptr; + if (Sec->sh_entsize != sizeof(Elf_Sym)) + report_fatal_error("Invalid symbol size"); + return reinterpret_cast(base() + Sec->sh_offset); } + const Elf_Sym *symbol_end(const Elf_Shdr *Sec) const { + if (!Sec) + return nullptr; + uint64_t Size = Sec->sh_size; + if (Size % sizeof(Elf_Sym)) + report_fatal_error("Invalid symbol table size"); + return symbol_begin(Sec) + Size / sizeof(Elf_Sym); + } + Elf_Sym_Range symbols(const Elf_Shdr *Sec) const { + return make_range(symbol_begin(Sec), symbol_end(Sec)); + } + + const Elf_Sym *symbol_begin() const { return symbol_begin(dot_symtab_sec); } + const Elf_Sym *symbol_end() const { return symbol_end(dot_symtab_sec); } + Elf_Sym_Range symbols() const { return symbols(dot_symtab_sec); } const Elf_Sym *dynamic_symbol_begin() const { - if (!DotDynSymSec) - return nullptr; - if (DotDynSymSec->sh_entsize != sizeof(Elf_Sym)) - report_fatal_error("Invalid symbol size"); - return reinterpret_cast(base() + DotDynSymSec->sh_offset); - } - - const Elf_Sym *dynamic_symbol_end() const { - if (!DotDynSymSec) - return nullptr; - return reinterpret_cast(base() + DotDynSymSec->sh_offset + - DotDynSymSec->sh_size); - } - - Elf_Sym_Range dynamic_symbols() const { - return make_range(dynamic_symbol_begin(), dynamic_symbol_end()); + return symbol_begin(DotDynSymSec); } + const Elf_Sym *dynamic_symbol_end() const { return symbol_end(DotDynSymSec); } + Elf_Sym_Range dynamic_symbols() const { return symbols(DotDynSymSec); } typedef iterator_range Elf_Rela_Range; @@ -602,23 +606,6 @@ const typename ELFFile::Elf_Shdr *ELFFile::section_end() const { return section_begin() + getNumSections(); } -template -const typename ELFFile::Elf_Sym *ELFFile::symbol_begin() 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(base() + dot_symtab_sec->sh_offset); -} - -template -const typename ELFFile::Elf_Sym *ELFFile::symbol_end() const { - if (!dot_symtab_sec) - return nullptr; - return reinterpret_cast(base() + dot_symtab_sec->sh_offset + - dot_symtab_sec->sh_size); -} - template template const T *ELFFile::getEntry(uint32_t Section, uint32_t Entry) const { diff --git a/test/Object/Inputs/invalid-symbol-table-size.elf b/test/Object/Inputs/invalid-symbol-table-size.elf new file mode 100755 index 0000000000000000000000000000000000000000..8329abbbd71207ca93602a4e2687a77e221895e9 GIT binary patch literal 536 zcmb<-^>JfjWMpQ50!9Wq21XbMiJpPPb^x;-7}&6?gec?zQ%n#JGO1URT2aEFmsDKL zkj9`_TvAk$m;|INbHQ{jUK%H<;A(>JDWvd{Gftcui2Ju0d4J3&K9FW+^ zOcrDgkSzzqApPiWZ~%&71L*qMfr>bQm|Xp0K)qN(pTPkr4g!V{3hYLZI*?r;AOWEm E0J6#uH~;_u literal 0 HcmV?d00001 diff --git a/test/Object/invalid.test b/test/Object/invalid.test index 1d5a70b3487..a4219ed592d 100644 --- a/test/Object/invalid.test +++ b/test/Object/invalid.test @@ -44,3 +44,7 @@ INVALID-SECTION-INDEX: Invalid section index RUN: not llvm-readobj -s %p/Inputs/invalid-section-size.elf 2>&1 | FileCheck --check-prefix=INVALID-SECTION-SIZE %s INVALID-SECTION-SIZE: Invalid section header entry size (e_shentsize) in ELF header + + +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