@@ -154,19 +154,25 @@ internal func _CFSwiftStringGetBytes(_ str: AnyObject, encoding: CFStringEncodin
154154 // TODO: Don't treat many encodings like they are UTF8
155155 case CFStringEncoding ( kCFStringEncodingUTF8) , CFStringEncoding ( kCFStringEncodingISOLatin1) , CFStringEncoding ( kCFStringEncodingMacRoman) , CFStringEncoding ( kCFStringEncodingASCII) , CFStringEncoding ( kCFStringEncodingNonLossyASCII) :
156156 let encodingView = ( str as! NSString ) . substring ( with: NSRange ( range) ) . utf8
157- if let buffer = buffer {
158- for (idx, character) in encodingView. enumerated ( ) {
157+ var converted = 0
158+ for (idx, character) in encodingView. enumerated ( ) {
159+ if encoding == CFStringEncoding ( kCFStringEncodingASCII) && !Unicode. ASCII. isASCII ( character) { break }
160+ if let buffer, maxBufLen > 0 {
161+ if idx >= maxBufLen { break }
159162 buffer. advanced ( by: idx) . initialize ( to: character)
160163 }
164+ converted += 1
161165 }
162- usedBufLen? . pointee = encodingView . count
163- convertedLength = encodingView . count
166+ usedBufLen? . pointee = converted
167+ convertedLength = converted
164168
165169 case CFStringEncoding ( kCFStringEncodingUTF16) :
166170 let encodingView = ( str as! NSString ) . _swiftObject. utf16
167171 let start = encodingView. startIndex
172+ var converted = 0
168173 if let buffer = buffer {
169174 for idx in 0 ..< range. length {
175+ if idx * 2 >= maxBufLen { break }
170176 // Since character is 2 bytes but the buffer is in term of 1 byte values, we have to split it up
171177 let character = encodingView [ encodingView. index ( start, offsetBy: idx + range. location) ]
172178#if _endian(big)
@@ -178,11 +184,12 @@ internal func _CFSwiftStringGetBytes(_ str: AnyObject, encoding: CFStringEncodin
178184#endif
179185 buffer. advanced ( by: idx * 2 ) . initialize ( to: byte0)
180186 buffer. advanced ( by: ( idx * 2 ) + 1 ) . initialize ( to: byte1)
187+ converted += 1
181188 }
182189 }
183190 // Every character was 2 bytes
184- usedBufLen? . pointee = range . length * 2
185- convertedLength = range . length
191+ usedBufLen? . pointee = converted * 2
192+ convertedLength = converted
186193
187194 default :
188195 fatalError ( " Attempted to get bytes of a Swift string using an unsupported encoding " )
0 commit comments