mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[Serialization] Soft-reject swiftmodules built against a different SDK
Change the way swiftmodules built against a different SDK than their clients are rejected. This makes them silently ignored when the module can be rebuilt from their swiftinterface, instead of reporting a hard error. rdar://93257769
This commit is contained in:
@@ -173,6 +173,7 @@ static ValidationInfo validateControlBlock(
|
||||
llvm::BitstreamCursor &cursor, SmallVectorImpl<uint64_t> &scratch,
|
||||
std::pair<uint16_t, uint16_t> expectedVersion, bool requiresOSSAModules,
|
||||
bool requiresRevisionMatch,
|
||||
StringRef requiredSDK,
|
||||
ExtendedValidationInfo *extendedInfo,
|
||||
PathObfuscator &pathRecoverer) {
|
||||
// The control block is malformed until we've at least read a major version
|
||||
@@ -307,6 +308,21 @@ static ValidationInfo validateControlBlock(
|
||||
break;
|
||||
case control_block::SDK_NAME: {
|
||||
result.sdkName = blobData;
|
||||
|
||||
// The loaded module was built with a compatible SDK if either:
|
||||
// * it was the same SDK
|
||||
// * or one who's name is a prefix of the clients' SDK name. This expects
|
||||
// that a module built with macOS11 can be used with the macOS11.secret SDK.
|
||||
// This is generally the case as SDKs with suffixes are a superset of the
|
||||
// short SDK name equivalent. While this is accepted, this is still not a
|
||||
// recommended configuration and may lead to unreadable swiftmodules.
|
||||
StringRef moduleSDK = blobData;
|
||||
if (!moduleSDK.empty() && !requiredSDK.empty() &&
|
||||
!requiredSDK.startswith(moduleSDK)) {
|
||||
result.status = Status::SDKMismatch;
|
||||
return result;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case control_block::REVISION: {
|
||||
@@ -443,7 +459,7 @@ bool serialization::isSerializedAST(StringRef data) {
|
||||
}
|
||||
|
||||
ValidationInfo serialization::validateSerializedAST(
|
||||
StringRef data, bool requiresOSSAModules,
|
||||
StringRef data, bool requiresOSSAModules, StringRef requiredSDK,
|
||||
ExtendedValidationInfo *extendedInfo,
|
||||
SmallVectorImpl<SerializationOptions::FileDependency> *dependencies) {
|
||||
ValidationInfo result;
|
||||
@@ -487,6 +503,7 @@ ValidationInfo serialization::validateSerializedAST(
|
||||
cursor, scratch,
|
||||
{SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR},
|
||||
requiresOSSAModules, /*requiresRevisionMatch=*/true,
|
||||
requiredSDK,
|
||||
extendedInfo, localObfuscator);
|
||||
if (result.status == Status::Malformed)
|
||||
return result;
|
||||
@@ -995,8 +1012,8 @@ bool ModuleFileSharedCore::readModuleDocIfPresent(PathObfuscator &pathRecoverer)
|
||||
|
||||
info = validateControlBlock(
|
||||
docCursor, scratch, {SWIFTDOC_VERSION_MAJOR, SWIFTDOC_VERSION_MINOR},
|
||||
RequiresOSSAModules, /*requiresRevisionMatch=*/false,
|
||||
/*extendedInfo*/ nullptr, pathRecoverer);
|
||||
RequiresOSSAModules, /*requiresRevisionMatch*/false,
|
||||
/*requiredSDK*/StringRef(), /*extendedInfo*/nullptr, pathRecoverer);
|
||||
if (info.status != Status::Valid)
|
||||
return false;
|
||||
// Check that the swiftdoc is actually for this module.
|
||||
@@ -1139,9 +1156,8 @@ bool ModuleFileSharedCore::readModuleSourceInfoIfPresent(PathObfuscator &pathRec
|
||||
info = validateControlBlock(
|
||||
infoCursor, scratch,
|
||||
{SWIFTSOURCEINFO_VERSION_MAJOR, SWIFTSOURCEINFO_VERSION_MINOR},
|
||||
RequiresOSSAModules, /*requiresRevisionMatch=*/false,
|
||||
/*extendedInfo*/ nullptr,
|
||||
pathRecoverer);
|
||||
RequiresOSSAModules, /*requiresRevisionMatch*/false,
|
||||
/*requiredSDK*/StringRef(), /*extendedInfo*/nullptr, pathRecoverer);
|
||||
if (info.status != Status::Valid)
|
||||
return false;
|
||||
// Check that the swiftsourceinfo is actually for this module.
|
||||
@@ -1215,7 +1231,7 @@ ModuleFileSharedCore::ModuleFileSharedCore(
|
||||
std::unique_ptr<llvm::MemoryBuffer> moduleInputBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> moduleDocInputBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> moduleSourceInfoInputBuffer,
|
||||
bool isFramework, bool requiresOSSAModules,
|
||||
bool isFramework, bool requiresOSSAModules, StringRef requiredSDK,
|
||||
serialization::ValidationInfo &info, PathObfuscator &pathRecoverer)
|
||||
: ModuleInputBuffer(std::move(moduleInputBuffer)),
|
||||
ModuleDocInputBuffer(std::move(moduleDocInputBuffer)),
|
||||
@@ -1267,7 +1283,7 @@ ModuleFileSharedCore::ModuleFileSharedCore(
|
||||
info = validateControlBlock(
|
||||
cursor, scratch,
|
||||
{SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR},
|
||||
RequiresOSSAModules, /*requiresRevisionMatch=*/true,
|
||||
RequiresOSSAModules, /*requiresRevisionMatch=*/true, requiredSDK,
|
||||
&extInfo, pathRecoverer);
|
||||
if (info.status != Status::Valid) {
|
||||
error(info.status);
|
||||
|
||||
Reference in New Issue
Block a user