Skip to content

Commit 2ba3d65

Browse files
committed
Check read length
1 parent 854ecb8 commit 2ba3d65

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

Mixin/Service/DeviceTransfer/DeviceTransferMessageProcessor.swift

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)