summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/PDB
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2016-06-14 22:25:07 +0000
committerRui Ueyama <ruiu@google.com>2016-06-14 22:25:07 +0000
commit9f3e96115ce58f97b24a292c2ce64517a99722a6 (patch)
tree2d51eff17d306b79b2435a3737182182eeb2f947 /llvm/lib/DebugInfo/PDB
parent76c78a057a4c9dbf6a0d699a39ce515ddf2b6fc0 (diff)
downloadbcm5719-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')
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp26
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();
}
OpenPOWER on IntegriCloud