Skip to content

Commit e65848b

Browse files
spevansparkera
authored andcommitted
SR-936: NSMutableData.hash() causes a segmentation fault on Linux (swiftlang#1669)
- CFHash() doesnt see objects of type NSMutableData as CF objects so calls back to NSObject.hash which causes infinite recursion. - Directly call _CFNonObjCHash() to bypass this check.
1 parent e36e819 commit e65848b

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

Foundation/NSData.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ open class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding {
288288

289289
// MARK: - NSObject methods
290290
open override var hash: Int {
291-
return Int(bitPattern: CFHash(_cfObject))
291+
return Int(bitPattern: _CFNonObjCHash(_cfObject))
292292
}
293293

294294
/// Returns a Boolean value indicating whether this data object is the same as another.

TestFoundation/TestNSData.swift

+12-3
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,8 @@ class TestNSData: LoopbackServerTest {
503503
("test_validateMutation_slice_customBacking_withUnsafeMutableBytes_lengthLessThanLowerBound", test_validateMutation_slice_customBacking_withUnsafeMutableBytes_lengthLessThanLowerBound),
504504
("test_validateMutation_slice_customMutableBacking_withUnsafeMutableBytes_lengthLessThanLowerBound",
505505
test_validateMutation_slice_customMutableBacking_withUnsafeMutableBytes_lengthLessThanLowerBound),
506-
("test_discontiguousEnumerateBytes", test_discontiguousEnumerateBytes),
507-
("testBridgingCustom", testBridgingCustom),
506+
("test_discontiguousEnumerateBytes", test_discontiguousEnumerateBytes),
507+
("testBridgingCustom", testBridgingCustom),
508508
("testCustomData", testCustomData),
509509
("test_doubleDeallocation", test_doubleDeallocation),
510510
("test_rangeZoo", test_rangeZoo),
@@ -1422,7 +1422,16 @@ extension TestNSData {
14221422
let dataStruct = "Hello World".data(using: .utf8)!
14231423
let dataObj = dataStruct._bridgeToObjectiveC()
14241424
XCTAssertEqual(dataObj.hashValue, dataStruct.hashValue, "Data and NSData should have the same hash value")
1425-
}
1425+
1426+
XCTAssertEqual(NSData().hash, 0)
1427+
XCTAssertEqual(NSMutableData().hash, 0)
1428+
1429+
let data = Data([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
1430+
let d1 = NSData(data: data)
1431+
let md1 = NSMutableData(data: data)
1432+
XCTAssertEqual(d1.hash, 72772266)
1433+
XCTAssertEqual(md1.hash, 72772266)
1434+
}
14261435

14271436
func test_base64Data_medium() {
14281437
let data = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut at tincidunt arcu. Suspendisse nec sodales erat, sit amet imperdiet ipsum. Etiam sed ornare felis. Nunc mauris turpis, bibendum non lectus quis, malesuada placerat turpis. Nam adipiscing non massa et semper. Nulla convallis semper bibendum. Aliquam dictum nulla cursus mi ultricies, at tincidunt mi sagittis. Nulla faucibus at dui quis sodales. Morbi rutrum, dui id ultrices venenatis, arcu urna egestas felis, vel suscipit mauris arcu quis risus. Nunc venenatis ligula at orci tristique, et mattis purus pulvinar. Etiam ultricies est odio. Nunc eleifend malesuada justo, nec euismod sem ultrices quis. Etiam nec nibh sit amet lorem faucibus dapibus quis nec leo. Praesent sit amet mauris vel lacus hendrerit porta mollis consectetur mi. Donec eget tortor dui. Morbi imperdiet, arcu sit amet elementum interdum, quam nisl tempor quam, vitae feugiat augue purus sed lacus. In ac urna adipiscing purus venenatis volutpat vel et metus. Nullam nec auctor quam. Phasellus porttitor felis ac nibh gravida suscipit tempus at ante. Nunc pellentesque iaculis sapien a mattis. Aenean eleifend dolor non nunc laoreet, non dictum massa aliquam. Aenean quis turpis augue. Praesent augue lectus, mollis nec elementum eu, dignissim at velit. Ut congue neque id ullamcorper pellentesque. Maecenas euismod in elit eu vehicula. Nullam tristique dui nulla, nec convallis metus suscipit eget. Cras semper augue nec cursus blandit. Nulla rhoncus et odio quis blandit. Praesent lobortis dignissim velit ut pulvinar. Duis interdum quam adipiscing dolor semper semper. Nunc bibendum convallis dui, eget mollis magna hendrerit et. Morbi facilisis, augue eu fringilla convallis, mauris est cursus dolor, eu posuere odio nunc quis orci. Ut eu justo sem. Phasellus ut erat rhoncus, faucibus arcu vitae, vulputate erat. Aliquam nec magna viverra, interdum est vitae, rhoncus sapien. Duis tincidunt tempor ipsum ut dapibus. Nullam commodo varius metus, sed sollicitudin eros. Etiam nec odio et dui tempor blandit posuere.".data(using: .utf8)!

0 commit comments

Comments
 (0)