]> granicus.if.org Git - llvm/commitdiff
[llvm-readobj] Fix COFF RVA table dumping bug
authorReid Kleckner <rnk@google.com>
Fri, 23 Jun 2017 22:12:11 +0000 (22:12 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 23 Jun 2017 22:12:11 +0000 (22:12 +0000)
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

test/tools/llvm-readobj/Inputs/coff-load-config-data-end.exe [new file with mode: 0644]
test/tools/llvm-readobj/coff-load-config.test
tools/llvm-readobj/COFFDumper.cpp

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 (file)
index 0000000..9ec6942
Binary files /dev/null and b/test/tools/llvm-readobj/Inputs/coff-load-config-data-end.exe differ
index 97bd2e09292baa09e54e13591f43beca2d528573..1eb67beadde6302822c6fba99ce3365ecc8c513a 100644 (file)
@@ -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: ]
index 373c528feeafe7b6adeb7bf991d545237e28adaf..daa7a643a72f1a7f2f10f479a60ee9fbb60a0539 100644 (file)
@@ -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;