Skip to content

Commit ecaa041

Browse files
authored
Merge pull request #79165 from xymus/deser-protect-generic-params
Serialization: Protect `maybeReadGenericParams` against errors
2 parents 0b8efc9 + 6c23def commit ecaa041

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,7 +1197,8 @@ ModuleFile::getConformanceChecked(ProtocolConformanceID conformanceID) {
11971197
}
11981198
}
11991199

1200-
GenericParamList *ModuleFile::maybeReadGenericParams(DeclContext *DC) {
1200+
Expected<GenericParamList *>
1201+
ModuleFile::maybeReadGenericParams(DeclContext *DC) {
12011202
using namespace decls_block;
12021203

12031204
assert(DC && "need a context for the decls in the list");
@@ -1222,7 +1223,10 @@ GenericParamList *ModuleFile::maybeReadGenericParams(DeclContext *DC) {
12221223
ArrayRef<uint64_t> paramIDs;
12231224
GenericParamListLayout::readRecord(scratch, paramIDs);
12241225
for (DeclID nextParamID : paramIDs) {
1225-
auto genericParam = cast<GenericTypeParamDecl>(getDecl(nextParamID));
1226+
Decl *nextParam;
1227+
UNWRAP(getDeclChecked(nextParamID), nextParam);
1228+
1229+
auto genericParam = cast<GenericTypeParamDecl>(nextParam);
12261230
params.push_back(genericParam);
12271231
}
12281232

@@ -3427,7 +3431,8 @@ class DeclDeserializer {
34273431
DeclContext *DC;
34283432
UNWRAP(MF.getDeclContextChecked(contextID), DC);
34293433

3430-
auto genericParams = MF.maybeReadGenericParams(DC);
3434+
GenericParamList *genericParams;
3435+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
34313436
if (declOrOffset.isComplete())
34323437
return declOrOffset;
34333438

@@ -3586,7 +3591,8 @@ class DeclDeserializer {
35863591
if (declOrOffset.isComplete())
35873592
return declOrOffset;
35883593

3589-
auto genericParams = MF.maybeReadGenericParams(DC);
3594+
GenericParamList *genericParams;
3595+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
35903596
if (declOrOffset.isComplete())
35913597
return declOrOffset;
35923598

@@ -3700,7 +3706,8 @@ class DeclDeserializer {
37003706
if (declOrOffset.isComplete())
37013707
return declOrOffset;
37023708

3703-
auto *genericParams = MF.maybeReadGenericParams(parent);
3709+
GenericParamList *genericParams;
3710+
UNWRAP(MF.maybeReadGenericParams(parent), genericParams);
37043711
if (declOrOffset.isComplete())
37053712
return declOrOffset;
37063713

@@ -4254,7 +4261,8 @@ class DeclDeserializer {
42544261
// Read generic params before reading the type, because the type may
42554262
// reference generic parameters, and we want them to have a dummy
42564263
// DeclContext for now.
4257-
GenericParamList *genericParams = MF.maybeReadGenericParams(DC);
4264+
GenericParamList *genericParams;
4265+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
42584266

42594267
auto staticSpelling = getActualStaticSpellingKind(rawStaticSpelling);
42604268
if (!staticSpelling.has_value())
@@ -4488,7 +4496,8 @@ class DeclDeserializer {
44884496
if (declOrOffset.isComplete())
44894497
return cast<OpaqueTypeDecl>(declOrOffset.get());
44904498

4491-
auto genericParams = MF.maybeReadGenericParams(declContext);
4499+
GenericParamList *genericParams;
4500+
UNWRAP(MF.maybeReadGenericParams(declContext), genericParams);
44924501

44934502
// Create the decl.
44944503
auto opaqueDecl = OpaqueTypeDecl::get(
@@ -4689,7 +4698,8 @@ class DeclDeserializer {
46894698
ctx.evaluator.cacheOutput(InheritedProtocolsRequest{proto},
46904699
ctx.AllocateCopy(inherited));
46914700

4692-
auto genericParams = MF.maybeReadGenericParams(DC);
4701+
GenericParamList *genericParams;
4702+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
46934703
assert(genericParams && "protocol with no generic parameters?");
46944704
ctx.evaluator.cacheOutput(GenericParamListRequest{proto},
46954705
std::move(genericParams));
@@ -4884,7 +4894,8 @@ class DeclDeserializer {
48844894
if (declOrOffset.isComplete())
48854895
return declOrOffset;
48864896

4887-
auto genericParams = MF.maybeReadGenericParams(DC);
4897+
GenericParamList *genericParams;
4898+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
48884899
if (declOrOffset.isComplete())
48894900
return declOrOffset;
48904901

@@ -4962,7 +4973,8 @@ class DeclDeserializer {
49624973
return DCOrError.takeError();
49634974
auto DC = DCOrError.get();
49644975

4965-
auto genericParams = MF.maybeReadGenericParams(DC);
4976+
GenericParamList *genericParams;
4977+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
49664978
if (declOrOffset.isComplete())
49674979
return declOrOffset;
49684980

@@ -5157,7 +5169,8 @@ class DeclDeserializer {
51575169
if (declOrOffset.isComplete())
51585170
return declOrOffset;
51595171

5160-
auto *genericParams = MF.maybeReadGenericParams(parent);
5172+
GenericParamList *genericParams;
5173+
UNWRAP(MF.maybeReadGenericParams(parent), genericParams);
51615174
if (declOrOffset.isComplete())
51625175
return declOrOffset;
51635176

@@ -5263,7 +5276,12 @@ class DeclDeserializer {
52635276
// Generic parameter lists are written from outermost to innermost.
52645277
// Keep reading until we run out of generic parameter lists.
52655278
GenericParamList *outerParams = nullptr;
5266-
while (auto *genericParams = MF.maybeReadGenericParams(DC)) {
5279+
while (true) {
5280+
GenericParamList *genericParams;
5281+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
5282+
if (!genericParams)
5283+
break;
5284+
52675285
genericParams->setOuterParameters(outerParams);
52685286

52695287
// Set up the DeclContexts for the GenericTypeParamDecls in the list.
@@ -5407,7 +5425,8 @@ class DeclDeserializer {
54075425
if (declOrOffset.isComplete())
54085426
return declOrOffset;
54095427

5410-
auto *genericParams = MF.maybeReadGenericParams(parent);
5428+
GenericParamList *genericParams;
5429+
UNWRAP(MF.maybeReadGenericParams(parent), genericParams);
54115430
if (declOrOffset.isComplete())
54125431
return declOrOffset;
54135432

lib/Serialization/ModuleFile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ class ModuleFile
507507
///
508508
/// If the record at the cursor is not a generic param list, returns null
509509
/// without moving the cursor.
510-
GenericParamList *maybeReadGenericParams(DeclContext *DC);
510+
llvm::Expected<GenericParamList *> maybeReadGenericParams(DeclContext *DC);
511511

512512
/// Reads a set of requirements from \c DeclTypeCursor.
513513
void deserializeGenericRequirements(ArrayRef<uint64_t> scratch,

0 commit comments

Comments
 (0)