From: Rui Ueyama Date: Tue, 14 Jun 2016 22:25:07 +0000 (+0000) Subject: [pdbdump] Verify TPI hash for LF_ENUM type records. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2c70155651a4b0095829257682ad81d2c25e6c51;p=llvm [pdbdump] Verify TPI hash for LF_ENUM type records. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272728 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/lib/DebugInfo/PDB/Raw/TpiStream.cpp index 79fcfc7440f..74456112829 100644 --- a/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ b/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 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 Enum = EnumRecord::deserialize(TypeRecordKind::Enum, D); + if (Enum.getError()) return make_error(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(raw_error_code::corrupt_file, + "Corrupt TPI hash table."); return Error::success(); }