diff --git a/src/comio/comio_nix.c b/src/comio/comio_nix.c
index cc3a66217fbdf469e2c65a6db2f4bfd006e054bc..fec34264fa2a8073fd079aca2b5ff6d1476b44a5 100644
--- a/src/comio/comio_nix.c
+++ b/src/comio/comio_nix.c
@@ -408,7 +408,7 @@ int comGetModemStatus(COM_HANDLE handle)
 
 static bool comSetFlags(COM_HANDLE handle, int flags, bool set)
 {
-    int cmd = set ? TIOCMBIS : TIOCMBIC;
+    unsigned long cmd = set ? TIOCMBIS : TIOCMBIC;
 
     return (ioctl(handle, cmd, &flags) == 0);
 }
diff --git a/src/conio/cterm.c b/src/conio/cterm.c
index 00cc83749d9dd25521e690c0d91d12f4ece7b5af..db75cf211698c7dfe054f2d55a420d49abae85c9 100644
--- a/src/conio/cterm.c
+++ b/src/conio/cterm.c
@@ -2287,9 +2287,9 @@ all_done:
 					p++;
 				}
 				plen = get_hexstrlen(p, end);
-				p += plen * 2;
 				if (plen == -1)
 					return;
+				p += plen * 2;
 				mlen += ul * plen;
 				if (p <= end) {
 					if (*p == ';')
@@ -2321,6 +2321,8 @@ all_done:
 					p++;
 				}
 				plen = get_hexstrlen(p, end);
+				if (plen == -1)
+					return;
 				for (i = 0; i < ul; i++) {
 					get_hexstr(p, end, out);
 					out += plen;
@@ -2331,6 +2333,8 @@ all_done:
 			}
 			else {
 				plen = get_hexstrlen(p, end);
+				if (plen == -1)
+					return;
 				get_hexstr(p, end, out);
 				out += plen;
 				p += plen * 2;
diff --git a/src/conio/curs_cio.c b/src/conio/curs_cio.c
index 49fe3a5836083723ee316cf60503830b4d5fab3d..a524614992b5f452e5a5455b0e8586da14081bf5 100644
--- a/src/conio/curs_cio.c
+++ b/src/conio/curs_cio.c
@@ -1242,8 +1242,12 @@ void curs_textmode(int mode)
 	getmaxyx(stdscr, maxy, maxx);
 	if (maxy > 255)
 		maxy = 255;
+	if (maxy < 0)
+		maxy = 24;
 	if (maxx > 255)
 		maxx = 255;
+	if (maxx < 0)
+		maxx = 80;
 	cio_textinfo.screenheight = maxy;
 	cio_textinfo.screenwidth = maxx;
 	if(has_colors())
diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c
index bfe0fbfb71f366a0f42f8604ececb1db7ae78813..f038e8e7ac833e1ee8a94c88f4fb2f81ee77454b 100644
--- a/src/sbbs3/zmodem.c
+++ b/src/sbbs3/zmodem.c
@@ -914,8 +914,14 @@ int zmodem_recv_data16(zmodem_t* zm, register unsigned char* p, unsigned maxlen,
 
 	crc = ucrc16(subpkt_type,crc);
 
-	rxd_crc  = zmodem_rx(zm) << 8;
-	rxd_crc |= zmodem_rx(zm);
+	c = zmodem_rx(zm);
+	if (c < 0)
+		return c;
+	rxd_crc  = c << 8;
+	c = zmodem_rx(zm);
+	if (c < 0)
+		return c;
+	rxd_crc |= c;
 
 	if(rxd_crc != crc) {
 		lprintf(zm, LOG_DEBUG, "%lu %s CRC ERROR (%04hX, expected: %04hX) Bytes=%u, subpacket type=%s"
@@ -1049,20 +1055,24 @@ int zmodem_recv_nibble(zmodem_t* zm)
 int zmodem_recv_hex(zmodem_t* zm)
 {
 	int n1;
+	unsigned un1;
 	int n0;
+	unsigned un0;
 	int ret;
 
 	n1 = zmodem_recv_nibble(zm);
 
 	if(n1 < 0)
 		return n1;
+	un1 = n1;
 
 	n0 = zmodem_recv_nibble(zm);
 
 	if(n0 < 0)
 		return n0;
+	un0 = n0;
 
-	ret = (n1 << 4) | n0;
+	ret = (un1 << 4) | un0;
 
 //	lprintf(zm,LOG_DEBUG, __FUNCTION__ " returning: 0x%02X", ret);
 
@@ -1539,9 +1549,13 @@ static unsigned new_window_size(zmodem_t* zm, time_t start, unsigned pos)
 	time_t elapsed = time(NULL) - start;
 	if(elapsed < 1)
 		elapsed = 1;
-	unsigned cps = (unsigned)(pos / elapsed);
-	if(cps < 1)
+	uint64_t cps = (uint64_t)(pos / elapsed);
+	if (cps < 1)
 		cps = 1;
+	if (cps > UINT_MAX)
+		cps = UINT_MAX;
+	if (cps * zm->target_window_size > UINT_MAX)
+		cps = UINT_MAX / zm->target_window_size;
 	return cps * zm->target_window_size;
 }
 
diff --git a/src/syncterm/modem.c b/src/syncterm/modem.c
index 0ed695442fa2fc77eec809a78035a0e2fb5dd2ca..b394344ad1faaf84214f279e9a6132987113b532 100644
--- a/src/syncterm/modem.c
+++ b/src/syncterm/modem.c
@@ -87,9 +87,9 @@ modem_output_thread(void *args)
 			sent = 0;
 			while (com != COM_HANDLE_INVALID && sent < wr) {
 				ret = comWriteBuf(com, conn_api.wr_buf + sent, wr - sent);
-				sent += ret;
-				if (ret == COM_ERROR)
+				if (ret < 0)
 					break;
+				sent += ret;
 			}
 		}
 		else {
diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c
index 333b97c32c079ff02e2b9f7efa269693e062cc2d..2cdfe17da8781ac629180ac9ce0b3254eab0a2b0 100644
--- a/src/syncterm/rlogin.c
+++ b/src/syncterm/rlogin.c
@@ -65,7 +65,7 @@ rlogin_output_thread(void *args)
 			while (rlogin_sock != INVALID_SOCKET && sent < wr) {
 				if (socket_writable(rlogin_sock, 100)) {
 					ret = sendsocket(rlogin_sock, conn_api.wr_buf + sent, wr - sent);
-					if (ret == -1)
+					if (ret < 0)
 						break;
 					sent += ret;
 				}
diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index 71884a72195fa034e0c5fffa3412e96f6291a5f2..6518e031a4be152afc2344b83e1eadfd4ea4f7cd 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -2072,9 +2072,12 @@ xmodem_download(struct bbslist *bbs, long mode, char *path)
 			break;
 		if ((cps = (unsigned)(file_bytes / t)) == 0)
 			cps = 1;
-		if (--total_files <= 0)
+		if (total_files == 0 || --total_files == 0)
 			extra_pass = true;
-		total_bytes -= file_bytes;
+		if (file_bytes < total_bytes)
+			total_bytes -= file_bytes;
+		else
+			total_bytes = 0;
 		if ((total_files > 1) && total_bytes) {
 			lprintf(LOG_INFO, "Remaining - Time: %lu:%02lu  Files: %u  KBytes: %" PRId64,
 			    (total_bytes / cps) / 60,
diff --git a/src/xpdev/genwrap.c b/src/xpdev/genwrap.c
index 14570c625387190720d4432005537e1c16e32479..2513f11dcf8bddb3dc7b966b4853fc037ad14cbf 100644
--- a/src/xpdev/genwrap.c
+++ b/src/xpdev/genwrap.c
@@ -61,8 +61,8 @@ int safe_snprintf(char *dst, size_t size, const char *fmt, ...)
 	if(numchars==-1)
 		numchars=strlen(dst);
 #endif
-	if(numchars>=(int)size && numchars>0)
-		numchars=size-1;
+	if ((size_t)numchars >= size && numchars > 0)
+		numchars = size - 1;
 	return(numchars);
 }