Skip to content

Commit cff753a

Browse files
authored
Fix crash on invalid Swift language version (#3380)
Throw an error instead. rdar://75936643
1 parent ece5717 commit cff753a

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

Sources/PackageLoading/PackageDescription4Loader.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,11 @@ enum ManifestJSONParser {
7171
}
7272

7373
return try versionJSON.map {
74-
try SwiftLanguageVersion(string: String(json: $0))!
74+
let languageVersionString = try String(json: $0)
75+
guard let languageVersion = SwiftLanguageVersion(string: languageVersionString) else {
76+
throw ManifestParseError.runtimeManifestErrors(["invalid Swift language version: \(languageVersionString)"])
77+
}
78+
return languageVersion
7579
}
7680
}
7781

Tests/PackageLoadingTests/PD5_0LoadingTests.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,26 @@ class PackageDescription5_0LoadingTests: PackageDescriptionLoadingTests {
114114
XCTAssertMatch(message, .contains("'v3' is unavailable"))
115115
XCTAssertMatch(message, .contains("'v3' was obsoleted in PackageDescription 5"))
116116
}
117+
118+
stream = BufferedOutputByteStream()
119+
stream <<< """
120+
import PackageDescription
121+
let package = Package(
122+
name: "Foo",
123+
swiftLanguageVersions: [.version("")]
124+
)
125+
"""
126+
127+
do {
128+
try loadManifestThrowing(stream.bytes) { _ in }
129+
XCTFail()
130+
} catch {
131+
guard case let ManifestParseError.runtimeManifestErrors(messages) = error else {
132+
return XCTFail("unexpected error: \(error)")
133+
}
134+
135+
XCTAssertEqual(messages, ["invalid Swift language version: "])
136+
}
117137
}
118138

119139
func testPlatformOptions() throws {

0 commit comments

Comments
 (0)