Skip to content

Commit 0b3b469

Browse files
committed
Fixed an infinite loop caused by force casting NSError to CocoaError.
1 parent cb6b2fa commit 0b3b469

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

Sources/Foundation/NSError.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,9 @@ extension CocoaError: _ObjectiveCBridgeable {
708708
}
709709

710710
public static func _forceBridgeFromObjectiveC(_ x: NSError, result: inout CocoaError?) {
711-
result = _unconditionallyBridgeFromObjectiveC(x)
711+
if !_conditionallyBridgeFromObjectiveC(x, result: &result) {
712+
fatalError("Unable to bridge \(CocoaError.self) to \(self)")
713+
}
712714
}
713715

714716
public static func _conditionallyBridgeFromObjectiveC(_ x: NSError, result: inout CocoaError?) -> Bool {

Tests/Foundation/TestNSError.swift

+6
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,10 @@ class TestCocoaError: XCTestCase {
222222
XCTAssertNotNil(e.underlying as? POSIXError)
223223
XCTAssertEqual(e.underlying as? POSIXError, POSIXError.init(.EACCES))
224224
}
225+
226+
func test_forceCast() {
227+
let nsError = NSError(domain: NSCocoaErrorDomain, code: CocoaError.coderInvalidValue.rawValue)
228+
let error = nsError as! CocoaError
229+
XCTAssertEqual(error.errorCode, CocoaError.coderInvalidValue.rawValue)
230+
}
225231
}

0 commit comments

Comments
 (0)