aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2017-06-23 22:12:11 +0000
committerReid Kleckner <rnk@google.com>2017-06-23 22:12:11 +0000
commitd24edfe46ae787d69661cf35dffa159e56a85389 (patch)
tree3e1d0212460acad78403566407a2539fd1f91663
parentbebeb6f17e2d9f187285d426738069590e40c679 (diff)
downloadllvm-d24edfe46ae787d69661cf35dffa159e56a85389.tar.gz
[llvm-readobj] Fix COFF RVA table dumping bug
We would return an error in getVaPtr if the RVA table being dumped was the last data in the .rdata section. Avoid the issue by subtracting one from the offset and adding it back to get an open interval again. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306171 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--test/tools/llvm-readobj/Inputs/coff-load-config-data-end.exebin0 -> 1536 bytes
-rw-r--r--test/tools/llvm-readobj/coff-load-config.test6
-rw-r--r--tools/llvm-readobj/COFFDumper.cpp6
3 files changed, 11 insertions, 1 deletions
diff --git a/test/tools/llvm-readobj/Inputs/coff-load-config-data-end.exe b/test/tools/llvm-readobj/Inputs/coff-load-config-data-end.exe
new file mode 100644
index 00000000000..9ec69426298
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/coff-load-config-data-end.exe
Binary files differ
diff --git a/test/tools/llvm-readobj/coff-load-config.test b/test/tools/llvm-readobj/coff-load-config.test
index 97bd2e09292..1eb67beadde 100644
--- a/test/tools/llvm-readobj/coff-load-config.test
+++ b/test/tools/llvm-readobj/coff-load-config.test
@@ -1,6 +1,8 @@
RUN: llvm-readobj -coff-load-config %S/Inputs/coff-load-config-x86.dll | FileCheck %s --check-prefix=X86
RUN: llvm-readobj -coff-load-config %S/Inputs/coff-load-config-x64.dll | FileCheck %s --check-prefix=X64
+RUN: llvm-readobj -coff-load-config %S/Inputs/coff-load-config-data-end.exe | FileCheck %s --check-prefix=DATAEND
+
X86: LoadConfig [
X86: Size: 0x5C
X86: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
@@ -85,3 +87,7 @@ X64: 0x180001970
X64: 0x180001B50
X64: 0x180001D90
X64: ]
+
+DATAEND: SEHTable [
+DATAEND-NEXT: 0x402006
+DATAEND-NEXT: ]
diff --git a/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp
index 373c528feea..daa7a643a72 100644
--- a/tools/llvm-readobj/COFFDumper.cpp
+++ b/tools/llvm-readobj/COFFDumper.cpp
@@ -763,7 +763,8 @@ void COFFDumper::printRVATable(uint64_t TableVA, uint64_t Count,
uint64_t EntrySize, PrintExtraCB PrintExtra) {
uintptr_t TableStart, TableEnd;
error(Obj->getVaPtr(TableVA, TableStart));
- error(Obj->getVaPtr(TableVA + Count * EntrySize, TableEnd));
+ error(Obj->getVaPtr(TableVA + Count * EntrySize - 1, TableEnd));
+ TableEnd++;
for (uintptr_t I = TableStart; I < TableEnd; I += EntrySize) {
uint32_t RVA = *reinterpret_cast<const ulittle32_t *>(I);
raw_ostream &OS = W.startLine();
@@ -804,6 +805,9 @@ void COFFDumper::printCOFFLoadConfig() {
template <typename T>
void COFFDumper::printCOFFLoadConfig(const T *Conf, LoadConfigTables &Tables) {
+ if (!Conf)
+ return;
+
ListScope LS(W, "LoadConfig");
char FormattedTime[20] = {};
time_t TDS = Conf->TimeDateStamp;