[llvm] r242981 - Refactor duplicated code and check for invalid symbol table size.
Rafael Espindola
rafael.espindola at gmail.com
Wed Jul 22 20:24:22 PDT 2015
Author: rafael
Date: Wed Jul 22 22:24:22 2015
New Revision: 242981
URL: http://llvm.org/viewvc/llvm-project?rev=242981&view=rev
Log:
Refactor duplicated code and check for invalid symbol table size.
Added:
llvm/trunk/test/Object/Inputs/invalid-symbol-table-size.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=242981&r1=242980&r2=242981&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELF.h (original)
+++ llvm/trunk/include/llvm/Object/ELF.h Wed Jul 22 22:24:22 2015
@@ -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 *dynamic_symbol_begin() const {
- if (!DotDynSymSec)
+ const Elf_Sym *symbol_begin(const Elf_Shdr *Sec) const {
+ if (!Sec)
return nullptr;
- if (DotDynSymSec->sh_entsize != sizeof(Elf_Sym))
+ if (Sec->sh_entsize != sizeof(Elf_Sym))
report_fatal_error("Invalid symbol size");
- return reinterpret_cast<const Elf_Sym *>(base() + DotDynSymSec->sh_offset);
+ return reinterpret_cast<const Elf_Sym *>(base() + Sec->sh_offset);
}
-
- const Elf_Sym *dynamic_symbol_end() const {
- if (!DotDynSymSec)
+ const Elf_Sym *symbol_end(const Elf_Shdr *Sec) const {
+ if (!Sec)
return nullptr;
- return reinterpret_cast<const Elf_Sym *>(base() + DotDynSymSec->sh_offset +
- DotDynSymSec->sh_size);
+ 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));
}
- Elf_Sym_Range dynamic_symbols() const {
- return make_range(dynamic_symbol_begin(), dynamic_symbol_end());
+ 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 {
+ 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<const Elf_Rela *> Elf_Rela_Range;
@@ -603,23 +607,6 @@ const typename ELFFile<ELFT>::Elf_Shdr *
}
template <class ELFT>
-const typename ELFFile<ELFT>::Elf_Sym *ELFFile<ELFT>::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<const Elf_Sym *>(base() + dot_symtab_sec->sh_offset);
-}
-
-template <class ELFT>
-const typename ELFFile<ELFT>::Elf_Sym *ELFFile<ELFT>::symbol_end() const {
- if (!dot_symtab_sec)
- return nullptr;
- return reinterpret_cast<const Elf_Sym *>(base() + dot_symtab_sec->sh_offset +
- dot_symtab_sec->sh_size);
-}
-
-template <class ELFT>
template <typename T>
const T *ELFFile<ELFT>::getEntry(uint32_t Section, uint32_t Entry) const {
ErrorOr<const Elf_Shdr *> Sec = getSection(Section);
Added: llvm/trunk/test/Object/Inputs/invalid-symbol-table-size.elf
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/invalid-symbol-table-size.elf?rev=242981&view=auto
==============================================================================
Binary files llvm/trunk/test/Object/Inputs/invalid-symbol-table-size.elf (added) and llvm/trunk/test/Object/Inputs/invalid-symbol-table-size.elf Wed Jul 22 22:24:22 2015 differ
Propchange: llvm/trunk/test/Object/Inputs/invalid-symbol-table-size.elf
------------------------------------------------------------------------------
svn:executable = *
Modified: llvm/trunk/test/Object/invalid.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/invalid.test?rev=242981&r1=242980&r2=242981&view=diff
==============================================================================
--- llvm/trunk/test/Object/invalid.test (original)
+++ llvm/trunk/test/Object/invalid.test Wed Jul 22 22:24:22 2015
@@ -44,3 +44,7 @@ INVALID-SECTION-INDEX: Invalid section i
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
More information about the llvm-commits
mailing list