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;