Skip to content

Commit 56a4e54

Browse files
committed
Nicely handle incomplete read/writes in posix code
Signed-off-by: falkTX <[email protected]>
1 parent 5d76ba8 commit 56a4e54

File tree

2 files changed

+33
-27
lines changed

2 files changed

+33
-27
lines changed

posix/JackSocket.cpp

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ int JackClientSocket::Close()
167167
int JackClientSocket::Read(void* data, int len)
168168
{
169169
int res;
170+
uint8_t* udata = (uint8_t*)data;
170171

171172
#if defined(__sun__) || defined(sun)
172173
if (fTimeOut > 0) {
@@ -193,30 +194,32 @@ int JackClientSocket::Read(void* data, int len)
193194
}
194195
#endif
195196

196-
if ((res = read(fSocket, data, len)) != len) {
197-
if (errno == EWOULDBLOCK || errno == EAGAIN) {
198-
jack_log("JackClientSocket::Read time out");
199-
// For a non blocking socket, a read failure is not considered as an error
200-
return 0;
201-
} else if (res != 0) {
202-
jack_error("Cannot read socket fd = %d res = %d err = %s", fSocket, res, strerror(errno));
203-
//return 0;
204-
return -1;
205-
} else if (errno == 0 || errno == ENOTCONN) {
206-
// aborted reading due to shutdown
207-
return JACK_REQUEST_ERR_ABORTED;
208-
} else {
197+
while (len != 0 && (res = read(fSocket, udata, len)) != len) {
198+
if (res <= 0) {
199+
if (errno == EWOULDBLOCK || errno == EAGAIN) {
200+
jack_log("JackClientSocket::Read time out on socket fd = %d", fSocket);
201+
// For a non blocking socket, a read failure is not considered as an error
202+
memset(data, 0, len);
203+
return 0;
204+
}
205+
if (errno == 0 || errno == ENOTCONN) {
206+
// aborted reading due to shutdown
207+
return JACK_REQUEST_ERR_ABORTED;
208+
}
209209
jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
210210
return -1;
211211
}
212-
} else {
213-
return 0;
212+
udata += res;
213+
len -= res;
214214
}
215+
216+
return 0;
215217
}
216218

217219
int JackClientSocket::Write(void* data, int len)
218220
{
219221
int res;
222+
uint8_t* udata = (uint8_t*)data;
220223

221224
#if defined(__sun__) || defined(sun)
222225
if (fTimeOut > 0) {
@@ -243,21 +246,24 @@ int JackClientSocket::Write(void* data, int len)
243246
}
244247
#endif
245248

246-
if ((res = write(fSocket, data, len)) != len) {
247-
if (errno == EWOULDBLOCK || errno == EAGAIN) {
248-
jack_log("JackClientSocket::Write time out");
249-
return 0; // For a non blocking socket, a write failure is not considered as an error
250-
} else if (res != 0) {
251-
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
252-
//return 0;
253-
return -1;
254-
} else {
249+
while (len != 0 && (res = write(fSocket, udata, len)) != len) {
250+
if (res <= 0) {
251+
if (errno == EWOULDBLOCK || errno == EAGAIN) {
252+
jack_log("JackClientSocket::Write time out on socket fd = %d", fSocket);
253+
return 0; // For a non blocking socket, a write failure is not considered as an error
254+
}
255+
if (errno == 0 || errno == ENOTCONN) {
256+
// aborted reading due to shutdown
257+
return JACK_REQUEST_ERR_ABORTED;
258+
}
255259
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
256260
return -1;
257261
}
258-
} else {
259-
return 0;
262+
udata += res;
263+
len -= res;
260264
}
265+
266+
return 0;
261267
}
262268

263269
JackServerSocket::JackServerSocket(): fSocket( -1)

posix/JackSocketServerChannel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ bool JackSocketServerChannel::Execute()
240240
jack_log("JackSocketServerChannel::Execute : cannot decode header");
241241
ClientKill(fd);
242242
// Decode request
243-
} else {
243+
} else if (header.fType != 0) {
244244
// Result is not needed here
245245
fDecoder->HandleRequest(socket, header.fType);
246246
}

0 commit comments

Comments
 (0)