Skip to content

Commit 59f635e

Browse files
committed
Fix a potential crash
If the read system call returned an error, we would crash (negative number of read bytes). Also fix compilation on Windows, but not really (only if fileDescriptor were available on FileHandle on Windows…).
1 parent 86494e0 commit 59f635e

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

Tests/JSONLoggerTests/Helpers/FileHandleHelper.swift

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,17 @@ extension FileHandle {
3535
let buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: 512, alignment: MemoryLayout<UInt8>.alignment)
3636
defer {buffer.deallocate()}
3737

38+
#if !os(Windows)
3839
var nread = 0
40+
let bufferCount = buffer.count
41+
#else
42+
var nread = Int32(0)
43+
let bufferCount = UInt32(buffer.count)
44+
#endif
3945
var ret = Data()
40-
repeat {
41-
nread = system_read(fileDescriptor, buffer.baseAddress, buffer.count)
42-
ret += buffer[0..<nread]
43-
} while nread > 0
46+
while ({ nread = system_read(fileDescriptor, buffer.baseAddress, bufferCount); return nread }()) > 0 {
47+
ret += buffer[0..<Int(nread)]
48+
}
4449
guard nread >= 0 else {
4550
throw Errno()
4651
}
@@ -50,12 +55,17 @@ extension FileHandle {
5055
let buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: 512, alignment: MemoryLayout<UInt8>.alignment)
5156
defer {buffer.deallocate()}
5257

58+
#if !os(Windows)
5359
var nread = 0
60+
let bufferCount = buffer.count
61+
#else
62+
var nread = Int32(0)
63+
let bufferCount = UInt32(buffer.count)
64+
#endif
5465
var ret = Data()
55-
repeat {
56-
nread = system_read(fileDescriptor, buffer.baseAddress, buffer.count)
57-
ret += buffer[0..<nread]
58-
} while nread > 0
66+
while ({ nread = system_read(fileDescriptor, buffer.baseAddress, bufferCount); return nread }()) > 0 {
67+
ret += buffer[0..<Int(nread)]
68+
}
5969
guard nread >= 0 else {
6070
throw Errno()
6171
}

0 commit comments

Comments
 (0)