diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-20 03:38:17 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-20 03:38:17 +0000 |
commit | 00ddb1416d99edf2718c0b8c942a8fe41ef42e16 (patch) | |
tree | 35d81bbc95c4c19a5d73215a9960b2fe4d36479e /llvm/tools/llvm-readobj/ELFDumper.cpp | |
parent | c46ffb7a49d18e4a6bf75eb7efcba3cca53221e8 (diff) | |
download | bcm5719-llvm-00ddb1416d99edf2718c0b8c942a8fe41ef42e16.tar.gz bcm5719-llvm-00ddb1416d99edf2718c0b8c942a8fe41ef42e16.zip |
llvm-readobj: Handle invalid references to the string table.
llvm-svn: 242658
Diffstat (limited to 'llvm/tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 3deeb8dfe5b..045f4dfc636 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -954,6 +954,14 @@ void printFlags(T Value, ArrayRef<EnumEntry<TFlag>> Flags, raw_ostream &OS) { } template <class ELFT> +static const char *getDynamicString(const ELFFile<ELFT> &O, uint64_t Value) { + const char *Ret = O.getDynamicString(Value); + if (!Ret) + reportError("Invalid dynamic string table reference"); + return Ret; +} + +template <class ELFT> static void printValue(const ELFFile<ELFT> *O, uint64_t Type, uint64_t Value, bool Is64, raw_ostream &OS) { switch (Type) { @@ -1011,14 +1019,14 @@ static void printValue(const ELFFile<ELFT> *O, uint64_t Type, uint64_t Value, OS << Value << " (bytes)"; break; case DT_NEEDED: - OS << "SharedLibrary (" << O->getDynamicString(Value) << ")"; + OS << "SharedLibrary (" << getDynamicString(*O, Value) << ")"; break; case DT_SONAME: - OS << "LibrarySoname (" << O->getDynamicString(Value) << ")"; + OS << "LibrarySoname (" << getDynamicString(*O, Value) << ")"; break; case DT_RPATH: case DT_RUNPATH: - OS << O->getDynamicString(Value); + OS << getDynamicString(*O, Value); break; case DT_MIPS_FLAGS: printFlags(Value, makeArrayRef(ElfDynamicDTMipsFlags), OS); @@ -1088,7 +1096,7 @@ void ELFDumper<ELFT>::printNeededLibraries() { for (const auto &Entry : Obj->dynamic_table()) if (Entry.d_tag == ELF::DT_NEEDED) - Libs.push_back(Obj->getDynamicString(Entry.d_un.d_val)); + Libs.push_back(getDynamicString(*Obj, Entry.d_un.d_val)); std::stable_sort(Libs.begin(), Libs.end()); |