Skip to content

Commit 3c62c74

Browse files
authored
Merge pull request swiftlang#72561 from xymus/harden-deser
Serialization: Harden recovery from broken deserialization context
2 parents ede7df6 + fa38cf9 commit 3c62c74

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,11 @@ ProtocolConformanceDeserializer::readInheritedProtocolConformance(
873873
InheritedProtocolConformanceLayout::readRecord(scratch, conformanceID,
874874
conformingTypeID);
875875

876-
Type conformingType = MF.getType(conformingTypeID);
876+
auto conformingTypeOrError =
877+
MF.getTypeChecked(conformingTypeID);
878+
if (!conformingTypeOrError)
879+
return conformingTypeOrError.takeError();
880+
Type conformingType = conformingTypeOrError.get();
877881

878882
PrettyStackTraceType trace(ctx, "reading inherited conformance for",
879883
conformingType);
@@ -3465,7 +3469,10 @@ class DeclDeserializer {
34653469
}
34663470
}
34673471

3468-
auto DC = MF.getDeclContext(contextID);
3472+
auto DCOrError = MF.getDeclContextChecked(contextID);
3473+
if (!DCOrError)
3474+
return DCOrError.takeError();
3475+
auto DC = DCOrError.get();
34693476
if (declOrOffset.isComplete())
34703477
return declOrOffset;
34713478

@@ -3806,14 +3813,22 @@ class DeclDeserializer {
38063813
AddAttribute(new (ctx) HasStorageAttr(/*isImplicit:*/true));
38073814

38083815
if (opaqueReturnTypeID) {
3816+
auto opaqueReturnType = MF.getDeclChecked(opaqueReturnTypeID);
3817+
if (!opaqueReturnType)
3818+
return opaqueReturnType.takeError();
3819+
38093820
ctx.evaluator.cacheOutput(
38103821
OpaqueResultTypeRequest{var},
3811-
cast<OpaqueTypeDecl>(MF.getDecl(opaqueReturnTypeID)));
3822+
cast<OpaqueTypeDecl>(opaqueReturnType.get()));
38123823
}
38133824

38143825
// If this is a lazy property, record its backing storage.
38153826
if (lazyStorageID) {
3816-
VarDecl *storage = cast<VarDecl>(MF.getDecl(lazyStorageID));
3827+
auto lazyStorageDecl = MF.getDeclChecked(lazyStorageID);
3828+
if (!lazyStorageDecl)
3829+
return lazyStorageDecl.takeError();
3830+
3831+
VarDecl *storage = cast<VarDecl>(lazyStorageDecl.get());
38173832
ctx.evaluator.cacheOutput(
38183833
LazyStoragePropertyRequest{var}, std::move(storage));
38193834
}

0 commit comments

Comments
 (0)