@@ -162,30 +162,69 @@ extension MemoryReader {
162
162
self . fd = fd
163
163
}
164
164
165
+ private func safeRead( _ fd: CInt , _ buffer: UnsafeMutableRawBufferPointer ) throws -> Int {
166
+ var done = 0
167
+ while done < buffer. count {
168
+ var ret : ssize_t = 0
169
+ repeat {
170
+ ret = read ( fd, buffer. baseAddress! + done, buffer. count - done)
171
+ } while ret < 0 && _swift_get_errno ( ) == EINTR
172
+ if ret < 0 {
173
+ throw POSIXError ( errno: _swift_get_errno ( ) )
174
+ }
175
+ if ret == 0 {
176
+ break
177
+ }
178
+ done += Int ( ret)
179
+ }
180
+
181
+ return done
182
+ }
183
+
184
+ private func safeWrite( _ fd: CInt , _ buffer: UnsafeRawBufferPointer ) throws -> Int {
185
+ var done = 0
186
+ while done < buffer. count {
187
+ var ret : ssize_t = 0
188
+ repeat {
189
+ ret = write ( fd, buffer. baseAddress! + done, buffer. count - done)
190
+ } while ret < 0 && _swift_get_errno ( ) == EINTR
191
+ if ret < 0 {
192
+ throw POSIXError ( errno: _swift_get_errno ( ) )
193
+ }
194
+ if ret == 0 {
195
+ break
196
+ }
197
+ done += Int ( ret)
198
+ }
199
+
200
+ return done
201
+ }
202
+
165
203
private func sendRequest( for bytes: Size , from addr: Address ) throws {
166
204
var request = memserver_req ( addr: addr, len: bytes)
167
205
try withUnsafeBytes ( of: & request) { ptr in
168
- let ret = write ( fd, ptr. baseAddress , ptr . count )
169
- if ret < 0 || ret != ptr. count {
170
- throw POSIXError ( errno : _swift_get_errno ( ) )
206
+ let ret = safeWrite ( fd, ptr)
207
+ if ret != ptr. count {
208
+ throw MemserverError ( message : " Channel closed prematurely " )
171
209
}
172
210
}
173
211
}
174
212
175
213
private func receiveReply( ) throws -> memserver_resp {
176
214
var response = memserver_resp ( addr: 0 , len: 0 )
177
215
try withUnsafeMutableBytes ( of: & response) { ptr in
178
- let ret = read ( fd, ptr. baseAddress , ptr . count )
179
- if ret < 0 || ret != ptr. count {
180
- throw POSIXError ( errno : _swift_get_errno ( ) )
216
+ let ret = safeRead ( fd, ptr)
217
+ if ret != ptr. count {
218
+ throw MemserverError ( message : " Channel closed prematurely " )
181
219
}
182
220
}
183
221
return response
184
222
}
185
223
186
224
public func fetch< T> ( from addr: Address ,
187
225
into buffer: UnsafeMutableBufferPointer < T > ) throws {
188
- try buffer. withMemoryRebound ( to: UInt8 . self) { bytes in
226
+ try buffer. withMemoryRebound ( to: UInt8 . self) {
227
+ let bytes = UnsafeMutableRawBufferPointer ( $0)
189
228
try sendRequest ( for: Size ( bytes. count) , from: addr)
190
229
191
230
var done = 0
@@ -200,12 +239,12 @@ extension MemoryReader {
200
239
throw MemserverError ( message: " Overrun at \( hex ( addr) ) trying to read \( bytes. count) bytes " )
201
240
}
202
241
203
- let ret = read ( fd,
204
- bytes . baseAddress! . advanced ( by : done ) ,
205
- Int ( reply. len) )
242
+ let ret = try safeRead ( fd,
243
+ UnsafeMutableRawBufferPointer (
244
+ rebasing : bytes [ done ..< done + Int( reply. len) ] ) )
206
245
207
- if ret < 0 || ret != reply. len {
208
- throw POSIXError ( errno : _swift_get_errno ( ) )
246
+ if ret != reply. len {
247
+ throw MemserverError ( message : " Channel closed prematurely " )
209
248
}
210
249
211
250
done += Int ( reply. len)
0 commit comments