@@ -216,12 +216,9 @@ static bool readOptionsBlock(llvm::BitstreamCursor &cursor,
216216
217217static ValidationInfo validateControlBlock (
218218 llvm::BitstreamCursor &cursor, SmallVectorImpl<uint64_t > &scratch,
219- std::pair<uint16_t , uint16_t > expectedVersion,
220- bool requiresOSSAModules,
221- bool requiresRevisionMatch,
222- StringRef requiredSDK,
223- ExtendedValidationInfo *extendedInfo,
224- PathObfuscator &pathRecoverer) {
219+ std::pair<uint16_t , uint16_t > expectedVersion, bool requiresOSSAModules,
220+ bool requiresRevisionMatch, StringRef requiredSDK, StringRef packageName,
221+ ExtendedValidationInfo *extendedInfo, PathObfuscator &pathRecoverer) {
225222 // The control block is malformed until we've at least read a major version
226223 // number.
227224 ValidationInfo result;
@@ -253,7 +250,16 @@ static ValidationInfo validateControlBlock(
253250 result.status = Status::Malformed;
254251 return result;
255252 }
256- if (!readOptionsBlock (cursor, scratch, *extendedInfo, pathRecoverer)) {
253+
254+ if (readOptionsBlock (cursor, scratch, *extendedInfo, pathRecoverer)) {
255+ // The client module must be in the same package as the
256+ // (optimized) binary module being loaded.
257+ if (extendedInfo && extendedInfo->serializePackageEnabled () &&
258+ extendedInfo->getModulePackageName () != packageName) {
259+ result.status = Status::Malformed;
260+ return result;
261+ }
262+ } else {
257263 result.status = Status::Malformed;
258264 return result;
259265 }
@@ -579,9 +585,8 @@ bool serialization::isSerializedAST(StringRef data) {
579585}
580586
581587ValidationInfo serialization::validateSerializedAST (
582- StringRef data, bool requiresOSSAModules,
583- StringRef requiredSDK,
584- ExtendedValidationInfo *extendedInfo,
588+ StringRef data, bool requiresOSSAModules, StringRef requiredSDK,
589+ StringRef packageName, ExtendedValidationInfo *extendedInfo,
585590 SmallVectorImpl<SerializationOptions::FileDependency> *dependencies,
586591 SmallVectorImpl<SearchPath> *searchPaths) {
587592 ValidationInfo result;
@@ -625,8 +630,7 @@ ValidationInfo serialization::validateSerializedAST(
625630 cursor, scratch,
626631 {SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR},
627632 requiresOSSAModules,
628- /* requiresRevisionMatch=*/ true ,
629- requiredSDK,
633+ /* requiresRevisionMatch=*/ true , requiredSDK, packageName,
630634 extendedInfo, localObfuscator);
631635 if (result.status != Status::Valid)
632636 return result;
@@ -1161,8 +1165,10 @@ bool ModuleFileSharedCore::readModuleDocIfPresent(PathObfuscator &pathRecoverer)
11611165 info = validateControlBlock (
11621166 docCursor, scratch, {SWIFTDOC_VERSION_MAJOR, SWIFTDOC_VERSION_MINOR},
11631167 RequiresOSSAModules,
1164- /* requiresRevisionMatch*/ false ,
1165- /* requiredSDK*/ StringRef (), /* extendedInfo*/ nullptr , pathRecoverer);
1168+ /* requiresRevisionMatch*/ false ,
1169+ /* requiredSDK*/ StringRef (),
1170+ /* packageName*/ StringRef (),
1171+ /* extendedInfo*/ nullptr , pathRecoverer);
11661172 if (info.status != Status::Valid)
11671173 return false ;
11681174 // Check that the swiftdoc is actually for this module.
@@ -1306,8 +1312,10 @@ bool ModuleFileSharedCore::readModuleSourceInfoIfPresent(PathObfuscator &pathRec
13061312 infoCursor, scratch,
13071313 {SWIFTSOURCEINFO_VERSION_MAJOR, SWIFTSOURCEINFO_VERSION_MINOR},
13081314 RequiresOSSAModules,
1309- /* requiresRevisionMatch*/ false ,
1310- /* requiredSDK*/ StringRef (), /* extendedInfo*/ nullptr , pathRecoverer);
1315+ /* requiresRevisionMatch*/ false ,
1316+ /* requiredSDK*/ StringRef (),
1317+ /* packageName*/ StringRef (),
1318+ /* extendedInfo*/ nullptr , pathRecoverer);
13111319 if (info.status != Status::Valid)
13121320 return false ;
13131321 // Check that the swiftsourceinfo is actually for this module.
@@ -1381,10 +1389,9 @@ ModuleFileSharedCore::ModuleFileSharedCore(
13811389 std::unique_ptr<llvm::MemoryBuffer> moduleInputBuffer,
13821390 std::unique_ptr<llvm::MemoryBuffer> moduleDocInputBuffer,
13831391 std::unique_ptr<llvm::MemoryBuffer> moduleSourceInfoInputBuffer,
1384- bool isFramework,
1385- bool requiresOSSAModules,
1386- StringRef requiredSDK,
1387- serialization::ValidationInfo &info, PathObfuscator &pathRecoverer)
1392+ bool isFramework, bool requiresOSSAModules, StringRef requiredSDK,
1393+ StringRef packageName, serialization::ValidationInfo &info,
1394+ PathObfuscator &pathRecoverer)
13881395 : ModuleInputBuffer(std::move(moduleInputBuffer)),
13891396 ModuleDocInputBuffer(std::move(moduleDocInputBuffer)),
13901397 ModuleSourceInfoInputBuffer(std::move(moduleSourceInfoInputBuffer)),
@@ -1436,8 +1443,8 @@ ModuleFileSharedCore::ModuleFileSharedCore(
14361443 cursor, scratch,
14371444 {SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR},
14381445 RequiresOSSAModules,
1439- /* requiresRevisionMatch=*/ true , requiredSDK,
1440- &extInfo, pathRecoverer);
1446+ /* requiresRevisionMatch=*/ true , requiredSDK, packageName, &extInfo,
1447+ pathRecoverer);
14411448 if (info.status != Status::Valid) {
14421449 error (info.status );
14431450 return ;
0 commit comments