diff --git a/src/syncterm/modem.c b/src/syncterm/modem.c index c309211dc4266b972cbdfe74a3240d27fa71fdac..d4a2a7bb6b02bd01989b604a9f976dcb6391bd43 100644 --- a/src/syncterm/modem.c +++ b/src/syncterm/modem.c @@ -87,9 +87,10 @@ modem_output_thread(void *args) sent = 0; while (com != COM_HANDLE_INVALID && sent < wr && !conn_api.terminate) { ret = comWriteBuf(com, conn_api.wr_buf + sent, wr - sent); + if (ret > 0 && ret <= (wr - sent)) + sent += ret; if (ret < 0) break; - sent += ret; } } else { diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c index fb5a1e6994022d1ea4dce6bd431e2099f6b307a2..ffffd2408f5f57ad3950db934993b66f34124f90 100644 --- a/src/syncterm/rlogin.c +++ b/src/syncterm/rlogin.c @@ -65,9 +65,10 @@ rlogin_output_thread(void *args) while (rlogin_sock != INVALID_SOCKET && sent < wr && !conn_api.terminate) { if (socket_writable(rlogin_sock, 100)) { ret = sendsocket(rlogin_sock, conn_api.wr_buf + sent, wr - sent); + if (ret > 0 && ret <= (wr - sent)) + sent += ret; if (ret < 0) break; - sent += ret; } } } diff --git a/src/xpdev/sockwrap.c b/src/xpdev/sockwrap.c index bb458a4a91be780b8fb6f824f3a198a12ddf59bd..f013652f78f5adf2e3d4866848cf9f67c6d7e3e5 100644 --- a/src/xpdev/sockwrap.c +++ b/src/xpdev/sockwrap.c @@ -188,7 +188,7 @@ off_t sendfilesocket(int sock, int file, off_t *offset, off_t count) break; while (sent < rd) { ssize_t wr = sendsocket(sock, buf + sent, rd - sent); - if (wr > 0) { + if (wr > 0 && wr <= (rd - sent)) { sent += wr; } else if (wr == SOCKET_ERROR && SOCKET_ERRNO == EWOULDBLOCK) { diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c index 27fe510878b9a978bbc0c140016b395d2b178edc..eb4c864952a8ac1485df2c99257249e9f7a9f18a 100644 --- a/src/xpdev/xpbeep.c +++ b/src/xpdev/xpbeep.c @@ -976,7 +976,7 @@ do_xp_play_sample(unsigned char *sampo, size_t sz, int *freed) size_t wr = 0; while (wr < sz) { ssize_t i = write(dsp, samp + wr, sz - wr); - if (i >= 0) + if (i >= 0 && i <= (sz - wr)) wr += i; else return false;