@@ -11,11 +11,12 @@ final class DeviceTransferMessageProcessor {
1111 enum ProcessingError : Error {
1212 case createInputStream
1313 case readInputStream( Error ? )
14+ case mismatchedLengthRead( required: Int , read: Int )
1415 case enumerateFiles
1516 }
1617
1718 private enum ReadStreamResult {
18- case success
19+ case success( Int )
1920 case endOfStream
2021 case operationFailed( Error ? )
2122 }
@@ -194,7 +195,7 @@ extension DeviceTransferMessageProcessor {
194195 totalBytesRead += bytesRead
195196 }
196197 }
197- return . success
198+ return . success( totalBytesRead )
198199 }
199200
200201 private func process( cache: Cache ) {
@@ -222,29 +223,34 @@ extension DeviceTransferMessageProcessor {
222223 return
223224 }
224225
225- let length : Int
226+ let requiredLength : Int
226227 switch read ( from: stream, to: & cacheReadingBuffer, length: Cache . messageLengthLayoutSize) {
227228 case . endOfStream:
228229 break streamReadingLoop
229230 case . operationFailed( let error) :
230231 processingError = . readInputStream( error)
231232 return
232233 case . success:
233- length = Int ( Cache . MessageLength ( data: cacheReadingBuffer, endianess: . little) )
234+ requiredLength = Int ( Cache . MessageLength ( data: cacheReadingBuffer, endianess: . little) )
234235 }
235236
236- if cacheReadingBuffer. count < length {
237- cacheReadingBuffer. count = length
237+ if cacheReadingBuffer. count < requiredLength {
238+ cacheReadingBuffer. count = requiredLength
238239 }
239- switch read ( from: stream, to: & cacheReadingBuffer, length: length ) {
240+ switch read ( from: stream, to: & cacheReadingBuffer, length: requiredLength ) {
240241 case . endOfStream:
241242 assertionFailure ( " Impossible " )
242243 Logger . general. error ( category: " DeviceTransferMessageProcessor " , message: " EOS after length is read " )
243244 case . operationFailed( let error) :
244245 processingError = . readInputStream( error)
245246 return
246- case . success:
247- let encryptedData = cacheReadingBuffer [ cacheReadingBuffer. startIndex..< cacheReadingBuffer. startIndex. advanced ( by: length) ]
247+ case . success( let readLength) :
248+ guard requiredLength == readLength else {
249+ Logger . general. error ( category: " DeviceTransferMessageProcessor " , message: " Error reading: \( readLength) , required: \( requiredLength) " )
250+ processingError = . mismatchedLengthRead( required: requiredLength, read: readLength)
251+ break streamReadingLoop
252+ }
253+ let encryptedData = cacheReadingBuffer [ ..< cacheReadingBuffer. startIndex. advanced ( by: readLength) ]
248254 do {
249255 let decryptedData = try AESCryptor . decrypt ( encryptedData, with: key)
250256 process ( jsonData: decryptedData)
0 commit comments