Skip to content

Commit 8ccc37a

Browse files
author
Pushkar Kulkarni
committed
Fix for a crash in String.substring(with:) [SR-2483]
1 parent da2fdd9 commit 8ccc37a

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

Foundation/NSString.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,14 @@ extension NSString {
346346
let start = _storage.utf16.startIndex
347347
let min = start.advanced(by: range.location)
348348
let max = start.advanced(by: range.location + range.length)
349-
return String(_storage.utf16[min..<max])!
349+
guard let substr = String(_storage.utf16[min..<max]) else {
350+
let newMax = max.advanced(by: -1)
351+
guard newMax > min else { return "" }
352+
let substr1 = NSMutableString(string: String(_storage.utf16[min..<newMax])!)
353+
substr1.append(String(describing: [_storage.utf16[max]]))
354+
return String(describing: substr1)
355+
}
356+
return substr
350357
} else {
351358
let buff = UnsafeMutablePointer<unichar>.allocate(capacity: range.length)
352359
getCharacters(buff, range: range)

TestFoundation/TestNSString.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class TestNSString : XCTestCase {
8989
("test_PrefixSuffix", test_PrefixSuffix),
9090
("test_utf16StringRangeCount", test_StringUTF16ViewIndexStrideableRange),
9191
("test_reflection", { _ in test_reflection }),
92+
("test_substringWithRange", test_substringWithRange),
9293
]
9394
}
9495

@@ -970,6 +971,18 @@ class TestNSString : XCTestCase {
970971
let mutableString = NSMutableString(string: "Test")
971972
XCTAssertEqual(mutableString, "Test")
972973
}
974+
975+
func test_substringWithRange() {
976+
let trivial = NSString(string: "swift.org")
977+
XCTAssertEqual(trivial.substring(with: NSMakeRange(0, 5)), "swift")
978+
979+
let endWithSurrogatePair = NSString(string: "Hurray🎉")
980+
XCTAssertEqual(endWithSurrogatePair.substring(with: NSMakeRange(0, 7)), "Hurray[57225]")
981+
982+
let crlf = NSString(string: "\r\n")
983+
XCTAssertEqual(crlf.substring(with: NSMakeRange(0,1)), "")
984+
XCTAssertEqual(crlf.substring(with: NSMakeRange(1,0)), "")
985+
}
973986
}
974987

975988
struct ComparisonTest {

0 commit comments

Comments
 (0)