From d24edfe46ae787d69661cf35dffa159e56a85389 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Fri, 23 Jun 2017 22:12:11 +0000 Subject: [PATCH] [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 --- .../Inputs/coff-load-config-data-end.exe | Bin 0 -> 1536 bytes test/tools/llvm-readobj/coff-load-config.test | 6 ++++++ tools/llvm-readobj/COFFDumper.cpp | 6 +++++- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 test/tools/llvm-readobj/Inputs/coff-load-config-data-end.exe 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 0000000000000000000000000000000000000000..9ec6942629858259cacff82fc362c10fa2b6915e GIT binary patch literal 1536 zcmeZ`V!#RcrMk$?gNLjn?)u1r$=jLl&l0uBs}KnXSlY_g+bgFOUxXaQY# M`0$xgFfu~`0LAd2=Kufz literal 0 HcmV?d00001 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(I); raw_ostream &OS = W.startLine(); @@ -804,6 +805,9 @@ void COFFDumper::printCOFFLoadConfig() { template void COFFDumper::printCOFFLoadConfig(const T *Conf, LoadConfigTables &Tables) { + if (!Conf) + return; + ListScope LS(W, "LoadConfig"); char FormattedTime[20] = {}; time_t TDS = Conf->TimeDateStamp; -- 2.50.1