@@ -173,6 +173,7 @@ static ValidationInfo validateControlBlock(
173173 llvm::BitstreamCursor &cursor, SmallVectorImpl<uint64_t > &scratch,
174174 std::pair<uint16_t , uint16_t > expectedVersion, bool requiresOSSAModules,
175175 bool requiresRevisionMatch,
176+ StringRef requiredSDK,
176177 ExtendedValidationInfo *extendedInfo,
177178 PathObfuscator &pathRecoverer) {
178179 // The control block is malformed until we've at least read a major version
@@ -307,6 +308,21 @@ static ValidationInfo validateControlBlock(
307308 break ;
308309 case control_block::SDK_NAME: {
309310 result.sdkName = blobData;
311+
312+ // The loaded module was built with a compatible SDK if either:
313+ // * it was the same SDK
314+ // * or one who's name is a prefix of the clients' SDK name. This expects
315+ // that a module built with macOS11 can be used with the macOS11.secret SDK.
316+ // This is generally the case as SDKs with suffixes are a superset of the
317+ // short SDK name equivalent. While this is accepted, this is still not a
318+ // recommended configuration and may lead to unreadable swiftmodules.
319+ StringRef moduleSDK = blobData;
320+ if (!moduleSDK.empty () && !requiredSDK.empty () &&
321+ !requiredSDK.startswith (moduleSDK)) {
322+ result.status = Status::SDKMismatch;
323+ return result;
324+ }
325+
310326 break ;
311327 }
312328 case control_block::REVISION: {
@@ -443,7 +459,7 @@ bool serialization::isSerializedAST(StringRef data) {
443459}
444460
445461ValidationInfo serialization::validateSerializedAST (
446- StringRef data, bool requiresOSSAModules,
462+ StringRef data, bool requiresOSSAModules, StringRef requiredSDK,
447463 ExtendedValidationInfo *extendedInfo,
448464 SmallVectorImpl<SerializationOptions::FileDependency> *dependencies) {
449465 ValidationInfo result;
@@ -487,6 +503,7 @@ ValidationInfo serialization::validateSerializedAST(
487503 cursor, scratch,
488504 {SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR},
489505 requiresOSSAModules, /* requiresRevisionMatch=*/ true ,
506+ requiredSDK,
490507 extendedInfo, localObfuscator);
491508 if (result.status == Status::Malformed)
492509 return result;
@@ -995,8 +1012,8 @@ bool ModuleFileSharedCore::readModuleDocIfPresent(PathObfuscator &pathRecoverer)
9951012
9961013 info = validateControlBlock (
9971014 docCursor, scratch, {SWIFTDOC_VERSION_MAJOR, SWIFTDOC_VERSION_MINOR},
998- RequiresOSSAModules, /* requiresRevisionMatch= */ false ,
999- /* extendedInfo */ nullptr , pathRecoverer);
1015+ RequiresOSSAModules, /* requiresRevisionMatch*/ false ,
1016+ /* requiredSDK */ StringRef (), /* extendedInfo */ nullptr , pathRecoverer);
10001017 if (info.status != Status::Valid)
10011018 return false ;
10021019 // Check that the swiftdoc is actually for this module.
@@ -1139,9 +1156,8 @@ bool ModuleFileSharedCore::readModuleSourceInfoIfPresent(PathObfuscator &pathRec
11391156 info = validateControlBlock (
11401157 infoCursor, scratch,
11411158 {SWIFTSOURCEINFO_VERSION_MAJOR, SWIFTSOURCEINFO_VERSION_MINOR},
1142- RequiresOSSAModules, /* requiresRevisionMatch=*/ false ,
1143- /* extendedInfo*/ nullptr ,
1144- pathRecoverer);
1159+ RequiresOSSAModules, /* requiresRevisionMatch*/ false ,
1160+ /* requiredSDK*/ StringRef (), /* extendedInfo*/ nullptr , pathRecoverer);
11451161 if (info.status != Status::Valid)
11461162 return false ;
11471163 // Check that the swiftsourceinfo is actually for this module.
@@ -1215,7 +1231,7 @@ ModuleFileSharedCore::ModuleFileSharedCore(
12151231 std::unique_ptr<llvm::MemoryBuffer> moduleInputBuffer,
12161232 std::unique_ptr<llvm::MemoryBuffer> moduleDocInputBuffer,
12171233 std::unique_ptr<llvm::MemoryBuffer> moduleSourceInfoInputBuffer,
1218- bool isFramework, bool requiresOSSAModules,
1234+ bool isFramework, bool requiresOSSAModules, StringRef requiredSDK,
12191235 serialization::ValidationInfo &info, PathObfuscator &pathRecoverer)
12201236 : ModuleInputBuffer(std::move(moduleInputBuffer)),
12211237 ModuleDocInputBuffer(std::move(moduleDocInputBuffer)),
@@ -1267,7 +1283,7 @@ ModuleFileSharedCore::ModuleFileSharedCore(
12671283 info = validateControlBlock (
12681284 cursor, scratch,
12691285 {SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR},
1270- RequiresOSSAModules, /* requiresRevisionMatch=*/ true ,
1286+ RequiresOSSAModules, /* requiresRevisionMatch=*/ true , requiredSDK,
12711287 &extInfo, pathRecoverer);
12721288 if (info.status != Status::Valid) {
12731289 error (info.status );
0 commit comments