From 2eea1812c8c989b1455c6537d9e1c4b8f0d621c5 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 12 May 2016 22:46:41 +0000 Subject: [PATCH] [codeview] Fix dumping VFTables, stop when we see LF_PAD* Also stop visiting type records when we encounter an error. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@269374 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm/DebugInfo/CodeView/CVTypeVisitor.h | 5 +- .../DebugInfo/CodeView/RecordSerialization.h | 4 +- .../Inputs/codeview-vftable.obj.coff | Bin 0 -> 20396 bytes test/tools/llvm-readobj/codeview-vftable.test | 51 ++++++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff create mode 100644 test/tools/llvm-readobj/codeview-vftable.test diff --git a/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h b/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h index e13c1496e7b..bab18f247d0 100644 --- a/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h +++ b/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h @@ -78,8 +78,11 @@ public: /// Visits the type records in Data. Sets the error flag on parse failures. void visitTypeStream(ArrayRef Data) { - for (const auto &I : makeTypeRange(Data)) + for (const auto &I : makeTypeRange(Data)) { visitTypeRecord(I); + if (hadError()) + break; + } } /// Action to take on unknown types. By default, they are ignored. diff --git a/include/llvm/DebugInfo/CodeView/RecordSerialization.h b/include/llvm/DebugInfo/CodeView/RecordSerialization.h index 4f429307f91..3596360d5bc 100644 --- a/include/llvm/DebugInfo/CodeView/RecordSerialization.h +++ b/include/llvm/DebugInfo/CodeView/RecordSerialization.h @@ -14,6 +14,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Endian.h" +#include "llvm/DebugInfo/CodeView/CodeView.h" #include #include @@ -113,7 +114,8 @@ template struct serialize_array_tail_impl { std::error_code deserialize(ArrayRef &Data) const { T Field; - while (!Data.empty()) { + // Stop when we run out of bytes or we hit record padding bytes. + while (!Data.empty() && Data.front() < LF_PAD0) { if (auto EC = consume(Data, Field)) return EC; Item.push_back(Field); diff --git a/test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff b/test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff new file mode 100644 index 0000000000000000000000000000000000000000..388a7212eb259af7f80f0905d4208b8be02eb63f GIT binary patch literal 20396 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