summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-07-20 03:38:17 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-07-20 03:38:17 +0000
commit00ddb1416d99edf2718c0b8c942a8fe41ef42e16 (patch)
tree35d81bbc95c4c19a5d73215a9960b2fe4d36479e
parentc46ffb7a49d18e4a6bf75eb7efcba3cca53221e8 (diff)
downloadbcm5719-llvm-00ddb1416d99edf2718c0b8c942a8fe41ef42e16.tar.gz
bcm5719-llvm-00ddb1416d99edf2718c0b8c942a8fe41ef42e16.zip
llvm-readobj: Handle invalid references to the string table.
llvm-svn: 242658
-rwxr-xr-xllvm/test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64bin0 -> 1712 bytes
-rw-r--r--llvm/test/Object/corrupt.test7
-rw-r--r--llvm/tools/llvm-readobj/ELFDumper.cpp16
-rw-r--r--llvm/tools/llvm-readobj/llvm-readobj.cpp6
-rw-r--r--llvm/tools/llvm-readobj/llvm-readobj.h1
5 files changed, 23 insertions, 7 deletions
diff --git a/llvm/test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64 b/llvm/test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64
new file mode 100755
index 00000000000..bdaa3cf9208
--- /dev/null
+++ b/llvm/test/Object/Inputs/corrupt-invalid-strtab.elf.x86-64
Binary files differ
diff --git a/llvm/test/Object/corrupt.test b/llvm/test/Object/corrupt.test
index 0a655704610..2181c7e8907 100644
--- a/llvm/test/Object/corrupt.test
+++ b/llvm/test/Object/corrupt.test
@@ -24,3 +24,10 @@ RUN: not llvm-readobj %p/Inputs/corrupt-version.elf-x86_64 -dt \
RUN: 2>&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/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());
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp
index b525ce10004..3f03618bb22 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.cpp
+++ b/llvm/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/llvm/tools/llvm-readobj/llvm-readobj.h b/llvm/tools/llvm-readobj/llvm-readobj.h
index 8872fc21a39..58c50f58d75 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.h
+++ b/llvm/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);
OpenPOWER on IntegriCloud