From fa1a4b2275a4419dd575c229e842d9162ae7cb84 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 20 Jul 2015 03:38:17 +0000 Subject: [PATCH] llvm-readobj: Handle invalid references to the string table. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242658 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Inputs/corrupt-invalid-strtab.elf.x86-64 | Bin 0 -> 1712 bytes test/Object/corrupt.test | 7 +++++++ tools/llvm-readobj/ELFDumper.cpp | 16 ++++++++++++---- tools/llvm-readobj/llvm-readobj.cpp | 6 +++--- tools/llvm-readobj/llvm-readobj.h | 1 + 5 files changed, 23 insertions(+), 7 deletions(-) create mode 100755 test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64 diff --git a/test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64 b/test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64 new file mode 100755 index 0000000000000000000000000000000000000000..bdaa3cf920824ee8f8b2c8f71617a776e3c5250f GIT binary patch literal 1712 zcmcIk%}N_l6h8T}^(O@_T`0K7!h%qGA#~GjO4@2gP*=JT3ge_nO`w@TW-Q67K0=pW z`Uoz3ge-iFzJgDn=bJg-IF1ua13fVFo%@}?d*+_GKezWjmrEs~ROG$fuSA+OWUwi3 zrK*;iEXfn)tNJv}p2t7N6X$J>8gr%>!NfK}l;y+=G-{HctRy_~Dp?AVab=6Uw!GIC zN4&H+BKK+ZBS4yExw#!Ze`rEn5&vQeFJ7nZN4|JoD-69b@`sU9L7Q1Cs^I&g9(43k zB={zfy7jk|EM?WuXgN1!(fBn()PP*jF;mjlWb(wpUHh zpYHKDD$hy&JfEqq>}pWtw^SpJ`|&y+6Sg}uzS2m{2Iq+LLOij| zu;W|vKj0kIl*`WHxy=ia^JHn_9Mpkt^ud46`WF^Y+<=pc(P@30F9bXu&U<w7 zU;j|;MO*!C&1 | FileCheck --check-prefix=VER %s VER: Error reading file: Invalid data was encountered while parsing the file. + + +// The file is missing the dynamic string table but has references to it. +RUN: not llvm-readobj -dynamic-table %p/Inputs/corrupt-invalid-strtab.elf.x86-64 \ +RUN: 2>&1 | FileCheck --check-prefix=STRTAB %s + +STRTAB: Invalid dynamic string table reference diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 3deeb8dfe5b..045f4dfc636 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -953,6 +953,14 @@ void printFlags(T Value, ArrayRef> Flags, raw_ostream &OS) { } } +template +static const char *getDynamicString(const ELFFile &O, uint64_t Value) { + const char *Ret = O.getDynamicString(Value); + if (!Ret) + reportError("Invalid dynamic string table reference"); + return Ret; +} + template static void printValue(const ELFFile *O, uint64_t Type, uint64_t Value, bool Is64, raw_ostream &OS) { @@ -1011,14 +1019,14 @@ static void printValue(const ELFFile *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::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()); diff --git a/tools/llvm-readobj/llvm-readobj.cpp b/tools/llvm-readobj/llvm-readobj.cpp index b525ce10004..3f03618bb22 100644 --- a/tools/llvm-readobj/llvm-readobj.cpp +++ b/tools/llvm-readobj/llvm-readobj.cpp @@ -188,14 +188,14 @@ namespace opts { } // namespace opts -static void reportError(Twine Msg) { +namespace llvm { + +void reportError(Twine Msg) { outs() << Msg << "\n"; outs().flush(); exit(1); } -namespace llvm { - void error(std::error_code EC) { if (!EC) return; diff --git a/tools/llvm-readobj/llvm-readobj.h b/tools/llvm-readobj/llvm-readobj.h index 8872fc21a39..58c50f58d75 100644 --- a/tools/llvm-readobj/llvm-readobj.h +++ b/tools/llvm-readobj/llvm-readobj.h @@ -19,6 +19,7 @@ namespace llvm { } // Various helper functions. + void reportError(Twine Msg); void error(std::error_code ec); bool relocAddressLess(object::RelocationRef A, object::RelocationRef B); -- 2.34.1