Skip to content

Commit c4864d2

Browse files
committed
Add a few deserialization recovery paths.
This avoids cross-reference modularization error crashes in lldb/lldb-dap on Windows, seen with our internal app, reported at #69374.
1 parent 58a6bfb commit c4864d2

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,10 @@ Expected<Pattern *> ModuleFile::readPattern(DeclContext *owningDC) {
585585

586586
auto var = cast<VarDecl>(deserialized.get());
587587
auto result = NamedPattern::createImplicit(getContext(), var);
588-
recordPatternType(result, getType(typeID));
588+
auto typeOrErr = getTypeChecked(typeID);
589+
if (!typeOrErr)
590+
return typeOrErr.takeError();
591+
recordPatternType(result, typeOrErr.get());
589592
restoreOffset.reset();
590593
return result;
591594
}
@@ -3021,7 +3024,14 @@ void ModuleFile::configureStorage(AbstractStorageDecl *decl,
30213024

30223025
SmallVector<AccessorDecl*, 8> accessors;
30233026
for (DeclID id : rawIDs.IDs) {
3024-
auto accessor = dyn_cast_or_null<AccessorDecl>(getDecl(id));
3027+
auto accessorOrErr = getDeclChecked(id);
3028+
if (!accessorOrErr) {
3029+
if (!getContext().LangOpts.EnableDeserializationRecovery)
3030+
fatal(accessorOrErr.takeError());
3031+
diagnoseAndConsumeError(accessorOrErr.takeError());
3032+
continue;
3033+
}
3034+
auto accessor = dyn_cast_or_null<AccessorDecl>(accessorOrErr.get());
30253035
if (!accessor) return;
30263036
accessors.push_back(accessor);
30273037
}
@@ -3241,9 +3251,11 @@ class DeclDeserializer {
32413251
auto genericSig = MF.getGenericSignature(genericSigID);
32423252
alias->setGenericSignature(genericSig);
32433253

3244-
auto underlying = MF.getType(underlyingTypeID);
3245-
alias->setUnderlyingType(underlying);
3246-
3254+
auto underlyingOrErr = MF.getTypeChecked(underlyingTypeID);
3255+
if (!underlyingOrErr)
3256+
return underlyingOrErr.takeError();
3257+
alias->setUnderlyingType(underlyingOrErr.get());
3258+
32473259
if (auto accessLevel = getActualAccessLevel(rawAccessLevel))
32483260
alias->setAccess(*accessLevel);
32493261
else
@@ -4174,7 +4186,9 @@ class DeclDeserializer {
41744186
rawAccessLevel);
41754187

41764188
auto declContext = MF.getDeclContext(contextID);
4177-
auto interfaceSig = MF.getGenericSignature(interfaceSigID);
4189+
auto interfaceSigOrErr = MF.getGenericSignatureChecked(interfaceSigID);
4190+
if (!interfaceSigOrErr)
4191+
return interfaceSigOrErr.takeError();
41784192

41794193
// Check for reentrancy.
41804194
if (declOrOffset.isComplete())
@@ -4185,7 +4199,7 @@ class DeclDeserializer {
41854199
// Create the decl.
41864200
auto opaqueDecl = OpaqueTypeDecl::get(
41874201
/*NamingDecl=*/ nullptr, genericParams, declContext,
4188-
interfaceSig, /*OpaqueReturnTypeReprs*/ { });
4202+
interfaceSigOrErr.get(), /*OpaqueReturnTypeReprs*/ { });
41894203
declOrOffset = opaqueDecl;
41904204

41914205
auto namingDecl = cast<ValueDecl>(MF.getDecl(namingDeclID));

lib/Serialization/ModuleFile.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,14 @@ TypeDecl *ModuleFile::lookupNestedType(Identifier name,
440440
Decl *decl = declOrOffset;
441441
if (decl != parent)
442442
continue;
443-
return cast<TypeDecl>(getDecl(entry.second));
443+
Expected<Decl *> typeOrErr = getDeclChecked(entry.second);
444+
if (!typeOrErr) {
445+
if (!getContext().LangOpts.EnableDeserializationRecovery)
446+
fatal(typeOrErr.takeError());
447+
diagnoseAndConsumeError(typeOrErr.takeError());
448+
continue;
449+
}
450+
return cast<TypeDecl>(typeOrErr.get());
444451
}
445452
}
446453
}

0 commit comments

Comments
 (0)