diff options
author | Rui Ueyama <ruiu@google.com> | 2016-06-14 22:25:07 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2016-06-14 22:25:07 +0000 |
commit | 9f3e96115ce58f97b24a292c2ce64517a99722a6 (patch) | |
tree | 2d51eff17d306b79b2435a3737182182eeb2f947 /llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | |
parent | 76c78a057a4c9dbf6a0d699a39ce515ddf2b6fc0 (diff) | |
download | bcm5719-llvm-9f3e96115ce58f97b24a292c2ce64517a99722a6.tar.gz bcm5719-llvm-9f3e96115ce58f97b24a292c2ce64517a99722a6.zip |
[pdbdump] Verify TPI hash for LF_ENUM type records.
llvm-svn: 272728
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp index 79fcfc7440f..74456112829 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp @@ -73,15 +73,31 @@ TpiStream::~TpiStream() {} // Currently we only verify SRC_LINE records. static Error verifyTIHash(const codeview::CVType &Rec, uint32_t Expected, uint32_t NumHashBuckets) { + using namespace codeview; + ArrayRef<uint8_t> D = Rec.Data; - if (Rec.Type == codeview::LF_UDT_SRC_LINE || - Rec.Type == codeview::LF_UDT_MOD_SRC_LINE) { - uint32_t Hash = - hashStringV1(StringRef((const char *)D.data(), 4)) % NumHashBuckets; - if (Hash != Expected) + uint32_t Hash; + + switch (Rec.Type) { + case LF_UDT_SRC_LINE: + case LF_UDT_MOD_SRC_LINE: + Hash = hashStringV1(StringRef((const char *)D.data(), 4)); + break; + case LF_ENUM: { + ErrorOr<EnumRecord> Enum = EnumRecord::deserialize(TypeRecordKind::Enum, D); + if (Enum.getError()) return make_error<RawError>(raw_error_code::corrupt_file, "Corrupt TPI hash table."); + Hash = hashStringV1(Enum->getName()); + break; + } + default: + return Error::success(); } + + if ((Hash % NumHashBuckets) != Expected) + return make_error<RawError>(raw_error_code::corrupt_file, + "Corrupt TPI hash table."); return Error::success(); } |