Skip to content

Commit bd2044c

Browse files
committed
[CodeView] Call llvm::codeview::visitMemberRecordStream with the deserialized CVType whose kind is FieldListRecord.
llvm::codeview::visitMemberRecordStream expects to receive an array ref that's FieldListRecord's Data not a CVType's data which has 4 more bytes preceeding. The first 2 bytes indicate the size of the FieldListRecord, and following 2 bytes is always 0x1203. Inside llvm::codeview::visitMemberRecordStream, it iterates to the data to check if first two bytes matching some type record kinds. If the size coincidentally matches one type kind, it will start parsing from there and causing crash.
1 parent c09e533 commit bd2044c

File tree

4 files changed

+40
-18
lines changed

4 files changed

+40
-18
lines changed

lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -401,10 +401,13 @@ void PdbAstBuilder::BuildParentMap() {
401401
}
402402
};
403403

404-
CVType field_list = m_index.tpi().getType(tag.asTag().FieldList);
404+
CVType field_list_cvt = m_index.tpi().getType(tag.asTag().FieldList);
405405
ProcessTpiStream process(m_index, *ti, tag, m_parent_types);
406-
llvm::Error error = visitMemberRecordStream(field_list.data(), process);
407-
if (error)
406+
FieldListRecord field_list;
407+
if (llvm::Error error = TypeDeserializer::deserializeAs<FieldListRecord>(
408+
field_list_cvt, field_list))
409+
llvm::consumeError(std::move(error));
410+
if (llvm::Error error = visitMemberRecordStream(field_list.Data, process))
408411
llvm::consumeError(std::move(error));
409412
}
410413

@@ -757,22 +760,26 @@ bool PdbAstBuilder::CompleteTagDecl(clang::TagDecl &tag) {
757760
CVType field_list_cvt = m_index.tpi().getType(field_list_ti);
758761
if (field_list_cvt.kind() != LF_FIELDLIST)
759762
return false;
763+
FieldListRecord field_list;
764+
if (llvm::Error error = TypeDeserializer::deserializeAs<FieldListRecord>(
765+
field_list_cvt, field_list))
766+
llvm::consumeError(std::move(error));
760767

761768
// Visit all members of this class, then perform any finalization necessary
762769
// to complete the class.
763770
CompilerType ct = ToCompilerType(tag_qt);
764771
UdtRecordCompleter completer(best_ti, ct, tag, *this, m_index,
765772
m_cxx_record_map);
766-
auto error =
767-
llvm::codeview::visitMemberRecordStream(field_list_cvt.data(), completer);
773+
llvm::Error error =
774+
llvm::codeview::visitMemberRecordStream(field_list.Data, completer);
768775
completer.complete();
769776

770777
status.resolved = true;
771-
if (!error)
772-
return true;
773-
774-
llvm::consumeError(std::move(error));
775-
return false;
778+
if (error) {
779+
llvm::consumeError(std::move(error));
780+
return false;
781+
}
782+
return true;
776783
}
777784

778785
clang::QualType PdbAstBuilder::CreateSimpleType(TypeIndex ti) {
@@ -1118,10 +1125,14 @@ PdbAstBuilder::CreateFunctionDecl(PdbCompilandSymId func_id,
11181125
}
11191126
}
11201127
if (!tag_record.FieldList.isSimple()) {
1121-
CVType field_list = m_index.tpi().getType(tag_record.FieldList);
1128+
CVType field_list_cvt = m_index.tpi().getType(tag_record.FieldList);
1129+
FieldListRecord field_list;
1130+
if (llvm::Error error = TypeDeserializer::deserializeAs<FieldListRecord>(
1131+
field_list_cvt, field_list))
1132+
llvm::consumeError(std::move(error));
11221133
CreateMethodDecl process(m_index, m_clang, func_ti, function_decl,
11231134
parent_opaque_ty, func_name, func_ct);
1124-
if (llvm::Error err = visitMemberRecordStream(field_list.data(), process))
1135+
if (llvm::Error err = visitMemberRecordStream(field_list.Data, process))
11251136
llvm::consumeError(std::move(err));
11261137
}
11271138

lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -733,9 +733,14 @@ VariableInfo lldb_private::npdb::GetVariableLocationInfo(
733733
}
734734
if (IsTagRecord(class_cvt)) {
735735
TagRecord tag_record = CVTagRecord::create(class_cvt).asTag();
736-
CVType field_list = index.tpi().getType(tag_record.FieldList);
736+
CVType field_list_cvt = index.tpi().getType(tag_record.FieldList);
737+
FieldListRecord field_list;
738+
if (llvm::Error error =
739+
TypeDeserializer::deserializeAs<FieldListRecord>(
740+
field_list_cvt, field_list))
741+
llvm::consumeError(std::move(error));
737742
FindMembersSize find_members_size(members_info, index.tpi());
738-
if (llvm::Error err = visitMemberRecordStream(field_list.data(),
743+
if (llvm::Error err = visitMemberRecordStream(field_list.Data,
739744
find_members_size)) {
740745
llvm::consumeError(std::move(err));
741746
break;

llvm/lib/DebugInfo/PDB/Native/NativeTypeEnum.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,13 @@ NativeEnumEnumEnumerators::NativeEnumEnumEnumerators(
6767

6868
ContinuationIndex = ClassParent.getEnumRecord().FieldList;
6969
while (ContinuationIndex) {
70-
CVType FieldList = Types.getType(*ContinuationIndex);
71-
assert(FieldList.kind() == LF_FIELDLIST);
70+
CVType FieldListCVT = Types.getType(*ContinuationIndex);
71+
assert(FieldListCVT.kind() == LF_FIELDLIST);
7272
ContinuationIndex.reset();
73-
cantFail(visitMemberRecordStream(FieldList.data(), *this));
73+
FieldListRecord FieldList;
74+
cantFail(TypeDeserializer::deserializeAs<FieldListRecord>(FieldListCVT,
75+
FieldList));
76+
cantFail(visitMemberRecordStream(FieldList.Data, *this));
7477
}
7578
}
7679

llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,10 @@ class MemberRecordConversionVisitor : public TypeVisitorCallbacks {
490490

491491
Error LeafRecordImpl<FieldListRecord>::fromCodeViewRecord(CVType Type) {
492492
MemberRecordConversionVisitor V(Members);
493-
return visitMemberRecordStream(Type.content(), V);
493+
FieldListRecord FieldList;
494+
cantFail(TypeDeserializer::deserializeAs<FieldListRecord>(Type,
495+
FieldList));
496+
return visitMemberRecordStream(FieldList.Data, V);
494497
}
495498

496499
CVType LeafRecordImpl<FieldListRecord>::toCodeViewRecord(

0 commit comments

Comments
 (0)