diff --git a/src/sbbs3/addfiles.c b/src/sbbs3/addfiles.c
index 7ba7426d042cb560d81a17d840281ae24198938b..a45de9addb9ecdbf8f25b2fbb2b2223d400aa1dd 100644
--- a/src/sbbs3/addfiles.c
+++ b/src/sbbs3/addfiles.c
@@ -261,13 +261,15 @@ void addlist(char *inpath, uint dirnum, const char* uploader, uint dskip, uint s
 	printf("Adding %s to %s %s\n\n"
 		,listpath,scfg.lib[scfg.dir[dirnum]->lib]->sname,scfg.dir[dirnum]->sname);
 
-	fgets(nextline,255,stream);
+	if(fgets(nextline,255,stream) == NULL)
+		*nextline = '\0';
 	do {
 		char fdesc[LEN_FDESC + 1] = {0};
 		memset(ext, 0, sizeof(ext));
 		SAFECOPY(curline,nextline);
 		nextline[0]=0;
-		fgets(nextline,255,stream);
+		if(fgets(nextline,255,stream) == NULL)
+			*nextline = '\0';
 		truncsp(curline);
 		if(curline[0]<=' ' || (mode&ASCII_ONLY && (uchar)curline[0]>=0x7e))
 			continue;
@@ -362,7 +364,8 @@ void addlist(char *inpath, uint dirnum, const char* uploader, uint dskip, uint s
 					SAFECAT(ext,"\r\n");
 				}
 				nextline[0]=0;
-				fgets(nextline,255,stream);
+				if(fgets(nextline,255,stream) == NULL)
+					*nextline = '\0';
 			}
 		}
 
diff --git a/src/sbbs3/delfiles.c b/src/sbbs3/delfiles.c
index 2d5dd54f00e01ee894f6ccf94584e3b6e0927164..db029e8d4f3b0aba7473abd38aba94e8a2a00902 100644
--- a/src/sbbs3/delfiles.c
+++ b/src/sbbs3/delfiles.c
@@ -128,7 +128,11 @@ int main(int argc, char **argv)
 	backslash(cfg.ctrl_dir);
 
 	load_cfg(&cfg, /* text: */NULL, /* prep: */TRUE, /* node: */FALSE, str, sizeof(str));
-	(void)chdir(cfg.ctrl_dir);
+	if(chdir(cfg.ctrl_dir) != 0) {
+		fprintf(stderr, "ERROR %d (%s) changing directory to: %s"
+			,errno, strerror(errno), cfg.ctrl_dir);
+		return EXIT_FAILURE;
+	}
 
 	dirnum=libnum=-1;
 	if(argv[1][0]=='*')
diff --git a/src/sbbs3/dupefind.c b/src/sbbs3/dupefind.c
index 996c380d35d7baaab4e1880a74802ec5d84e516c..478a9ee7db5bd1f89900354e2730f47e452db2e5 100644
--- a/src/sbbs3/dupefind.c
+++ b/src/sbbs3/dupefind.c
@@ -118,7 +118,11 @@ int main(int argc,char **argv)
 		fprintf(stderr,"!ERROR loading configuration files: %s\n",str);
 		return(1);
 	}
-	(void)chdir(cfg.ctrl_dir);
+	if(chdir(cfg.ctrl_dir) != 0) {
+		fprintf(stderr, "ERROR %d (%s) changing directory to: %s"
+			,errno, strerror(errno), cfg.ctrl_dir);
+		return EXIT_FAILURE;
+	}
 
 	lputs("\n");
 
diff --git a/src/sbbs3/fixsmb.c b/src/sbbs3/fixsmb.c
index 3a2e6cfceb72568529a25c9904e7b7e346bdfba6..54e8420cd48eb138078e681f1cdc738e074db269 100644
--- a/src/sbbs3/fixsmb.c
+++ b/src/sbbs3/fixsmb.c
@@ -67,7 +67,8 @@ void sort_index(smb_t* smb)
 		,(int(*)(const void*, const void*))compare_index);
 
 	rewind(smb->sid_fp);
-	chsize(fileno(smb->sid_fp),0L);			/* Truncate the index */
+	if(chsize(fileno(smb->sid_fp),0L) != 0)			/* Truncate the index */
+		perror("truncating index");
 
 	printf("\nRe-writing index... \n");
 	smb->status.total_msgs=l;
@@ -163,13 +164,16 @@ int fixsmb(char* sub)
 		}
 
 		rewind(smb.sha_fp);
-		chsize(fileno(smb.sha_fp),0L);		/* Truncate the header allocation file */
+		if(chsize(fileno(smb.sha_fp),0L) != 0)		/* Truncate the header allocation file */
+			perror("truncating sha file");
 		rewind(smb.sda_fp);
-		chsize(fileno(smb.sda_fp),0L);		/* Truncate the data allocation file */
+		if(chsize(fileno(smb.sda_fp),0L) != 0)		/* Truncate the data allocation file */
+			perror("truncating sda file");
 	}
 
 	rewind(smb.sid_fp);
-	chsize(fileno(smb.sid_fp),0L);			/* Truncate the index */
+	if(chsize(fileno(smb.sid_fp),0L) != 0)		/* Truncate the index */
+		perror("truncating sid file");
 
 	if(renumber || rehash) {
 		printf("Truncating hash file (due to renumbering/rehashing)\n");
@@ -177,7 +181,8 @@ int fixsmb(char* sub)
 			printf("smb_open_hash returned %d: %s\n", i, smb.last_error);
 			exit(1);
 		}
-		chsize(fileno(smb.hash_fp),0L);
+		if(chsize(fileno(smb.hash_fp),0L) != 0)
+			perror("truncating hash file");
 	}
 
 	if(!(smb.status.attr&SMB_HYPERALLOC)) {
diff --git a/src/sbbs3/fmsgdump.c b/src/sbbs3/fmsgdump.c
index 608e4b2fc1db30c34c1af3bd32ea83b316d00742..5b1e2aac54884b7f025bd0cf59c512db267a7b78 100644
--- a/src/sbbs3/fmsgdump.c
+++ b/src/sbbs3/fmsgdump.c
@@ -109,7 +109,10 @@ int msgdump(FILE* fp, const char* fname)
 		return __COUNTER__;
 	}
 	fseek(fp, sizeof(hdr), SEEK_SET);
-	fread(body, len, 1, fp);
+	if(fread(body, len, 1, fp) != 1) {
+		perror("reading body text");
+		return __COUNTER__;
+	}
 	fprintf(bodyfp, "\n-start of message text-\n");
 	char* p = body;
 	while(*p && p < body + len) {
diff --git a/src/sbbs3/logon.cpp b/src/sbbs3/logon.cpp
index 3f07ab1723f1b3b9173f3e1855b8960dd18b5153..39794942f84ebd67f0b493347c6ea33811d803d4 100644
--- a/src/sbbs3/logon.cpp
+++ b/src/sbbs3/logon.cpp
@@ -33,6 +33,7 @@ bool sbbs_t::logon()
 {
 	char	str[256],c;
 	char 	tmp[512];
+	char	path[MAX_PATH+1];
 	uint	i,j,mailw,mailr;
 	int		kmode;
 	uint	totallogons;
@@ -460,10 +461,10 @@ bool sbbs_t::logon()
 
 	if(thisnode.status!=NODE_QUIET && (!REALSYSOP || cfg.sys_misc&SM_SYSSTAT)) {
 		int file;
-		safe_snprintf(str, sizeof(str), "%slogon.lst",cfg.data_dir);
-		if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
-			errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT|O_APPEND);
-			return(false); 
+		safe_snprintf(path, sizeof(path), "%slogon.lst",cfg.data_dir);
+		if((file=nopen(path,O_WRONLY|O_CREAT|O_APPEND))==-1) {
+			errormsg(WHERE,ERR_OPEN,path,O_RDWR|O_CREAT|O_APPEND);
+			return(false);
 		}
 		getuserstr(&cfg, useron.number, USER_NOTE, useron.note, sizeof(useron.note));
 		getuserstr(&cfg, useron.number, USER_LOCATION, useron.location, sizeof(useron.location));
@@ -472,8 +473,10 @@ bool sbbs_t::logon()
 			,cfg.sys_misc&SM_LISTLOC ? useron.location : useron.note
 			,tm.tm_hour,tm.tm_min
 			,connection,useron.ltoday > 999 ? 999 : useron.ltoday);
-		write(file,str,strlen(str));
-		close(file); 
+		int wr = write(file,str,strlen(str));
+		close(file);
+		if(wr < 0)
+			errormsg(WHERE, ERR_WRITE, path, strlen(str));
 	}
 
 	if(cfg.sys_logon[0]) {				/* execute system logon event */
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 8b0f0e8d399cc9ca91dc00bacd0cfe7d7f940149..32fb4e2e0a7077fab5dc3dcf35c6466ce7b692a8 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -56,7 +56,7 @@ const char* server_abbrev = "term";
 		int result = cryptDestroySession(session);
 
 		if(result != 0)
-			lprintf(LOG_ERR, "%04d SSH Error %d destroying Cryptlib Session %d from line %d"
+			lprintf(LOG_ERR, "%04d SSH ERROR %d destroying Cryptlib Session %d from line %d"
 				, sock, result, session, line);
 		else {
 			uint32_t remain = protected_uint32_adjust_fetch(&ssh_sessions, -1);
@@ -2144,9 +2144,11 @@ void input_thread(void *arg)
 
 		if(sbbs->passthru_socket_active == true) {
 			BOOL writable = FALSE;
-			if(socket_check(sbbs->passthru_socket, NULL, &writable, 1000) && writable)
-				(void)sendsocket(sbbs->passthru_socket, (char*)wrbuf, wr);
-			else
+			if(socket_check(sbbs->passthru_socket, NULL, &writable, 1000) && writable) {
+				if(sendsocket(sbbs->passthru_socket, (char*)wrbuf, wr) != wr)
+					lprintf(LOG_ERR, "Node %d ERROR %d writing to passthru socket"
+						,sbbs->cfg.node_num, ERROR_VALUE);
+			} else
 				lprintf(LOG_WARNING, "Node %d could not write to passthru socket (writable=%d)"
 					, sbbs->cfg.node_num, (int)writable);
 			continue;
@@ -2523,10 +2525,12 @@ void output_thread(void* arg)
 						,node, result, errno, i, spy_topic);
 			}
 			if(spy_socket[sbbs->cfg.node_num-1]!=INVALID_SOCKET)
-				(void)sendsocket(spy_socket[sbbs->cfg.node_num-1],(char*)buf+bufbot,i);
+				if(sendsocket(spy_socket[sbbs->cfg.node_num-1],(char*)buf+bufbot,i) != i)
+					lprintf(LOG_ERR, "%s ERROR %d writing to spy socket", node, ERROR_VALUE);
 #ifdef __unix__
 			if(uspy_socket[sbbs->cfg.node_num-1]!=INVALID_SOCKET)
-				(void)sendsocket(uspy_socket[sbbs->cfg.node_num-1],(char*)buf+bufbot,i);
+				if(sendsocket(uspy_socket[sbbs->cfg.node_num-1],(char*)buf+bufbot,i) != i)
+					lprintf(LOG_ERR, "%s ERROR %d writing to UNIX spy socket", node, ERROR_VALUE);
 #endif
 		}
 
@@ -2666,7 +2670,8 @@ void event_thread(void* arg)
 			if(filelength(file)<(int)(sizeof(time32_t)*(i+1))) {
 				sbbs->lprintf(LOG_WARNING,"Initializing last run time for event: %s"
 					,sbbs->cfg.event[i]->code);
-				write(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last));
+				if(write(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last)) != sizeof sbbs->cfg.event[i]->last)
+					sbbs->errormsg(WHERE, ERR_WRITE, str, 4);
 			} else {
 				if(read(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last))!=sizeof(sbbs->cfg.event[i]->last))
 					sbbs->errormsg(WHERE,ERR_READ,str,sizeof(time32_t));
@@ -2675,8 +2680,8 @@ void event_thread(void* arg)
 			if(sbbs->cfg.event[i]->misc&EVENT_INIT)
 				sbbs->cfg.event[i]->last=-1;
 		}
-		lastprepack=0;
-		read(file,&lastprepack,sizeof(lastprepack));	/* expected to fail first time */
+		if(read(file,&lastprepack,sizeof(lastprepack)) != sizeof lastprepack)	/* expected to fail first time */
+			lastprepack = 0;
 		close(file);
 	}
 
@@ -2690,7 +2695,8 @@ void event_thread(void* arg)
 			if(filelength(file)<(int)(sizeof(time32_t)*(i+1))) {
 				sbbs->lprintf(LOG_WARNING,"Initializing last call-out time for QWKnet hub: %s"
 					,sbbs->cfg.qhub[i]->id);
-				write(file,&sbbs->cfg.qhub[i]->last,sizeof(sbbs->cfg.qhub[i]->last));
+				if(write(file,&sbbs->cfg.qhub[i]->last,sizeof(sbbs->cfg.qhub[i]->last)) != sizeof sbbs->cfg.qhub[i]->last)
+					sbbs->errormsg(WHERE, ERR_WRITE, str, 4);
 			} else {
 				if(read(file,&sbbs->cfg.qhub[i]->last,sizeof(sbbs->cfg.qhub[i]->last))!=sizeof(sbbs->cfg.qhub[i]->last))
 					sbbs->errormsg(WHERE,ERR_READ,str,sizeof(sbbs->cfg.qhub[i]->last));
@@ -2870,7 +2876,8 @@ void event_thread(void* arg)
 					break;
 				}
 				lseek(file,(int)sbbs->cfg.total_events*4L,SEEK_SET);
-				write(file,&lastprepack,sizeof(lastprepack));
+				if(write(file,&lastprepack,sizeof(lastprepack)) != sizeof lastprepack)
+					sbbs->errormsg(WHERE, ERR_WRITE, str, sizeof lastprepack);
 				close(file);
 
 				remove(semfile);
@@ -3014,7 +3021,10 @@ void event_thread(void* arg)
 					sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr=0;
 					if(file!=-1) {
 						lseek(file,sbbs->cfg.sub[sbbs->cfg.qhub[i]->sub[j]->subnum]->ptridx*sizeof(int32_t),SEEK_SET);
-						read(file,&sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr,sizeof(sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr));
+						if(read(file,&sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr
+							,sizeof(sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr)) !=
+							 sizeof(sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr))
+							sbbs->errormsg(WHERE, ERR_READ, str, sizeof(uint32_t));
 					}
 				}
 				if(file!=-1)
@@ -3030,12 +3040,14 @@ void event_thread(void* arg)
 							while(filelength(file)<
 								sbbs->cfg.sub[sbbs->cfg.qhub[i]->sub[j]->subnum]->ptridx*4L) {
 								l32=l;
-								write(file,&l32,4);		/* initialize ptrs to null */
+								if(write(file,&l32,4) != 4)		/* initialize ptrs to null */
+									sbbs->errormsg(WHERE, ERR_WRITE, str, 4);
 							}
 							lseek(file
 								,sbbs->cfg.sub[sbbs->cfg.qhub[i]->sub[j]->subnum]->ptridx*sizeof(int32_t)
 								,SEEK_SET);
-							write(file,&sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr,sizeof(sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr));
+							if(write(file,&sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr,sizeof(sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr)) != sizeof sbbs->subscan[sbbs->cfg.qhub[i]->sub[j]->subnum].ptr)
+								sbbs->errormsg(WHERE, ERR_WRITE, str, 4);
 						}
 						close(file);
 					}
@@ -3049,7 +3061,8 @@ void event_thread(void* arg)
 					break;
 				}
 				lseek(file,sizeof(time32_t)*i,SEEK_SET);
-				write(file,&sbbs->cfg.qhub[i]->last,sizeof(sbbs->cfg.qhub[i]->last));
+				if(write(file,&sbbs->cfg.qhub[i]->last,sizeof(sbbs->cfg.qhub[i]->last)) != sizeof sbbs->cfg.qhub[i]->last)
+					sbbs->errormsg(WHERE, ERR_WRITE, str, 4);
 				close(file);
 
 				if(sbbs->cfg.qhub[i]->call[0]) {
@@ -3129,7 +3142,8 @@ void event_thread(void* arg)
 								continue;
 							}
 							lseek(file,(int)i*4L,SEEK_SET);
-							read(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last));
+							if(read(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last)) != sizeof sbbs->cfg.event[i]->last)
+								sbbs->errormsg(WHERE, ERR_READ, str, 4);
 							close(file);
 							if(now-sbbs->cfg.event[i]->last<(60*60))	/* event is done */
 								break;
@@ -3263,7 +3277,8 @@ void event_thread(void* arg)
 						break;
 					}
 					lseek(file,(int)i*4L,SEEK_SET);
-					write(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last));
+					if(write(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last)) != sizeof sbbs->cfg.event[i]->last)
+						sbbs->errormsg(WHERE, ERR_WRITE, str, 4);
 					close(file);
 
 					if(sbbs->cfg.event[i]->node != NODE_ANY
@@ -3811,10 +3826,12 @@ void sbbs_t::spymsg(const char* msg)
 	}
 
 	if(cfg.node_num && spy_socket[cfg.node_num-1]!=INVALID_SOCKET)
-		(void)sendsocket(spy_socket[cfg.node_num-1],str,strlen(str));
+		if(sendsocket(spy_socket[cfg.node_num-1],str,strlen(str)) < 1)
+			lprintf(LOG_ERR, "Node %d ERROR %d writing to spy socket", cfg.node_num, ERROR_VALUE);
 #ifdef __unix__
 	if(cfg.node_num && uspy_socket[cfg.node_num-1]!=INVALID_SOCKET)
-		(void)sendsocket(uspy_socket[cfg.node_num-1],str,strlen(str));
+		if(sendsocket(uspy_socket[cfg.node_num-1],str,strlen(str)) < 1)
+			lprintf(LOG_ERR, "Node %d ERROR %d writing to spy socket", cfg.node_num, ERROR_VALUE);
 #endif
 }
 
@@ -5211,7 +5228,8 @@ NO_SSH:
 			for(i=first_node;i<=last_node;i++)  {
 				if(&uspy_cb[i-1] == ts_cb) {
 					if(node_socket[i-1]==INVALID_SOCKET)
-						read(uspy_socket[i-1],str,sizeof(str));
+						if(read(uspy_socket[i-1],str,sizeof(str)) < 1)
+							*str = '\0';
 					if(!socket_check(uspy_socket[i-1],NULL,NULL,0)) {
 						lprintf(LOG_NOTICE,"Spy socket for node %d disconnected",i);
 						close_socket(uspy_socket[i-1]);
diff --git a/src/sbbs3/netmail.cpp b/src/sbbs3/netmail.cpp
index c9cd8083efba46a91344e938d0940226891a3fef..c251bd840ddecf0cf89b5be76adbb0cd9f7a0810 100644
--- a/src/sbbs3/netmail.cpp
+++ b/src/sbbs3/netmail.cpp
@@ -22,26 +22,30 @@
 #include "sbbs.h"
 #include "qwk.h"
 
-static void pt_zone_kludge(const fmsghdr_t* hdr,int fido)
+static bool pt_zone_kludge(const fmsghdr_t* hdr,int fido)
 {
 	char str[256];
 
 	sprintf(str,"\1INTL %hu:%hu/%hu %hu:%hu/%hu\r"
 		,hdr->destzone,hdr->destnet,hdr->destnode
 		,hdr->origzone,hdr->orignet,hdr->orignode);
-	write(fido,str,strlen(str));
+	if(write(fido,str,strlen(str)) < 1)
+		return false;
 
 	if(hdr->destpoint) {
 		sprintf(str,"\1TOPT %hu\r"
 			,hdr->destpoint);
-		write(fido,str,strlen(str)); 
+		if(write(fido,str,strlen(str)) < 1)
+			return false;
 	}
 
 	if(hdr->origpoint) {
 		sprintf(str,"\1FMPT %hu\r"
 			,hdr->origpoint);
-		write(fido,str,strlen(str)); 
+		if(write(fido,str,strlen(str)) < 1)
+			return false;
 	}
+	return true;
 }
 
 /****************************************************************************/
@@ -293,7 +297,11 @@ bool sbbs_t::netmail(const char *into, const char *title, int mode, smb_t* resmb
 		errormsg(WHERE,ERR_ALLOC,str,length);
 		return(false); 
 	}
-	read(file,buf,length);
+	if(read(file,buf,length) != length) {
+		close(file);
+		errormsg(WHERE, ERR_READ, str, length);
+		return false;
+	}
 	close(file);
 
 	smb_net_type_t nettype = NET_FIDO;
@@ -867,13 +875,18 @@ void sbbs_t::qwktonetmail(FILE *rep, char *block, char *into, uchar fromhub)
 		errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_EXCL);
 		return; 
 	}
-	write(fido,&hdr,sizeof(hdr));
+	if(write(fido,&hdr,sizeof(hdr)) != sizeof hdr) {
+		free(qwkbuf);
+		errormsg(WHERE, ERR_WRITE, str, sizeof hdr);
+		return;
+	}
 
 	pt_zone_kludge(&hdr,fido);
 
 	if(cfg.netmail_misc&NMAIL_DIRECT) {
 		sprintf(str,"\1FLAGS DIR\r\n");
-		write(fido,str,strlen(str)); 
+		if(write(fido,str,strlen(str)) < 1)
+			errormsg(WHERE, ERR_WRITE, str, 0);
 	}
 
 	l = QWK_BLOCK_LEN + kludge_hdrlen;
@@ -888,12 +901,14 @@ void sbbs_t::qwktonetmail(FILE *rep, char *block, char *into, uchar fromhub)
 		else if(qwkbuf[l]!=LF) {
 			if(qwkbuf[l]==QWK_NEWLINE) /* QWK cr/lf char converted to hard CR */
 				qwkbuf[l]=CR;
-			write(fido,(char *)qwkbuf+l,1); 
+			if(write(fido,(char *)qwkbuf+l,1) != 1)
+				errormsg(WHERE, ERR_WRITE, "fidonet netmail", 1);
 		}
 		l++;
 	}
 	l=0;
-	write(fido,(BYTE*)&l,sizeof(BYTE));	/* Null terminator */
+	if(write(fido,(BYTE*)&l,sizeof(BYTE)) != sizeof(BYTE))	/* Null terminator */
+		errormsg(WHERE, ERR_WRITE, "fidonet netmail", sizeof(BYTE));
 	close(fido);
 	free((char *)qwkbuf);
 	if(cfg.netmail_sem[0])		/* update semaphore file */
@@ -1378,7 +1393,8 @@ bool sbbs_t::qnetmail(const char *into, const char *subj, int mode, smb_t* resmb
 
 	fseeko(smb.sdt_fp,offset,SEEK_SET);
 	xlat=XLAT_NONE;
-	fwrite(&xlat,2,1,smb.sdt_fp);
+	if(fwrite(&xlat,2,1,smb.sdt_fp) != 1)
+		errormsg(WHERE, ERR_WRITE, smb.file, 2);
 	x=SDT_BLOCK_LEN-2;				/* Don't read/write more than 255 */
 	while(!feof(instream)) {
 		memset(buf,0,x);
@@ -1387,7 +1403,8 @@ bool sbbs_t::qnetmail(const char *into, const char *subj, int mode, smb_t* resmb
 			break;
 		if(j>1 && (j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR)
 			buf[j-1]=buf[j-2]=0;
-		fwrite(buf,j,1,smb.sdt_fp);
+		if(fwrite(buf,j,1,smb.sdt_fp) != 1)
+			errormsg(WHERE, ERR_WRITE, smb.file, j);
 		x=SDT_BLOCK_LEN; 
 	}
 	fflush(smb.sdt_fp);
diff --git a/src/sbbs3/node.c b/src/sbbs3/node.c
index cef55f5df2826589b48f3f8e8071a42c9abf7060..9a0e945fc778d9e972921151d0cbb60e3c03645c 100644
--- a/src/sbbs3/node.c
+++ b/src/sbbs3/node.c
@@ -236,8 +236,10 @@ static char* extended_status(int num, char* str)
 	if(nodeexb < 0)
 		return "No extended status file open";
 	lseek(nodeexb, num * 128, SEEK_SET);
-	read(nodeexb, str, 128);
-	str[127] = 0;
+	if(read(nodeexb, str, 128) != 128)
+		*str = '\0';
+	else
+		str[127] = 0;
 	return str;
 }
 
diff --git a/src/sbbs3/nopen.c b/src/sbbs3/nopen.c
index f18286b83c70ec7bf130f0e31a4c082df8b285ae..6202e501b9406fa77b2a1f321a95ffd406ce800a 100644
--- a/src/sbbs3/nopen.c
+++ b/src/sbbs3/nopen.c
@@ -30,7 +30,7 @@
 /* attempted file is already open or denying access  for some other reason. */
 /* All files are opened in BINARY mode.										*/
 /****************************************************************************/
-int nopen(const char* str, int access)
+int nopen(const char* str, uint access)
 {
 	int file,share,count=0;
 
@@ -58,7 +58,7 @@ int nopen(const char* str, int access)
 /* This function performs an nopen, but returns a file stream with a buffer */
 /* allocated.																*/
 /****************************************************************************/
-FILE* fnopen(int* fd, const char* str, int access)
+FILE* fnopen(int* fd, const char* str, uint access)
 {
 	char*	mode;
 	int		file;
diff --git a/src/sbbs3/nopen.h b/src/sbbs3/nopen.h
index 610b06b697b76ee463f16ddbd9fc75bd3864e057..eea75a380d4d49e1d5e600c0dfe4b1910196f966 100644
--- a/src/sbbs3/nopen.h
+++ b/src/sbbs3/nopen.h
@@ -30,8 +30,8 @@
 extern "C" {
 #endif
 
-int		nopen(const char* str, int access);
-FILE *	fnopen(int* file, const char* str, int access);
+int		nopen(const char* str, uint access);
+FILE *	fnopen(int* file, const char* str, uint access);
 BOOL	ftouch(const char* fname);
 BOOL	fmutex(const char* fname, const char* text, long max_age);
 BOOL	fcompare(const char* fn1, const char* fn2);
diff --git a/src/sbbs3/pktdump.c b/src/sbbs3/pktdump.c
index 7c20e30cb72448e78abde35981765bd9a12b89e6..09f487f552f1bdb8557f28978f5f609b467b0ab0 100644
--- a/src/sbbs3/pktdump.c
+++ b/src/sbbs3/pktdump.c
@@ -73,7 +73,7 @@ const char* fmsgattr_str(uint16_t attr)
 int pktdump(FILE* fp, const char* fname, FILE* good, FILE* bad)
 {
 	int			ch,lastch;
-	char		buf[128];
+	uint16_t	terminator = 0xffff;
 	char		to[FIDO_NAME_LEN];
 	char		from[FIDO_NAME_LEN];
 	char		subj[FIDO_SUBJ_LEN];
@@ -89,11 +89,15 @@ int pktdump(FILE* fp, const char* fname, FILE* good, FILE* bad)
 		return(-1);
 	}
 
-	fseek(fp,-2L,SEEK_END);
-	fread(buf,sizeof(BYTE),sizeof(buf),fp);
-	if(memcmp(buf,"\x00\x00",2)) {
-		fprintf(stderr,"%s !Packet missing terminating nulls: %02X %02X\n"
-			,fname,buf[0],buf[1]);
+	fseek(fp, -(sizeof terminator), SEEK_END);
+	if(fread(&terminator, sizeof terminator, 1, fp) != 1) {
+		fprintf(stderr,"%s !Error %d (%s) reading terminating nulls"
+			,fname, errno, strerror(errno));
+		return errno;
+	}
+	if(terminator != FIDO_PACKET_TERMINATOR) {
+		fprintf(stderr,"%s !Packet missing terminating nulls: %04X\n"
+			,fname, terminator);
 //		return(-2);
 	}
 
diff --git a/src/sbbs3/qwknodes.c b/src/sbbs3/qwknodes.c
index 0e1d98ea763b23ea4c3771e3b12bfb8c6878b43e..904115d1895a7e5aa56ae66c3c0b49b35a0df626 100644
--- a/src/sbbs3/qwknodes.c
+++ b/src/sbbs3/qwknodes.c
@@ -96,7 +96,8 @@ char *loadmsgtail(smbmsg_t* msg)
 			continue;
 		fseek(smb.sdt_fp,msg->hdr.offset+msg->dfield[i].offset
 			,SEEK_SET);
-		fread(&xlat,2,1,smb.sdt_fp);
+		if(fread(&xlat,2,1,smb.sdt_fp) != 1)
+			xlat = XLAT_NONE;
 		if(xlat!=XLAT_NONE) 		/* no translations supported */
 			continue;
 		length=msg->dfield[i].length-2;
diff --git a/src/sbbs3/scfg/scfgmsg.c b/src/sbbs3/scfg/scfgmsg.c
index 640c4fff4d4dd96fcaadc68900dc738d940b7458..c945169384ab92af730f86ae9bf8d5fdf7f11fd0 100644
--- a/src/sbbs3/scfg/scfgmsg.c
+++ b/src/sbbs3/scfg/scfgmsg.c
@@ -93,7 +93,7 @@ long import_msg_areas(enum import_list_type type, FILE* stream, unsigned grpnum
 	long		ported = 0;
 	int			total_qwk_confs = 0;
 	int			read_qwk_confs = 0;
-	int			qwk_confnum;
+	int			qwk_confnum = -1;
 	size_t		grpname_len = strlen(cfg.grp[grpnum]->sname);
 	char		duplicate_code[LEN_CODE+1]="";
 	uint		duplicate_codes = 0;	// consecutive duplicate codes
@@ -124,8 +124,10 @@ long import_msg_areas(enum import_list_type type, FILE* stream, unsigned grpnum
 					break;
 			}
 			str[0] = 0;
-			fgets(str,sizeof(str),stream);
-			total_qwk_confs = atoi(str) + 1;
+			if(fgets(str,sizeof(str),stream) == NULL)
+				total_qwk_confs = 0;
+			else
+				total_qwk_confs = atoi(str) + 1;
 			break;
 		case IMPORT_LIST_TYPE_ECHOSTATS:
 			new_sub_misc = SUB_FIDO;
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 54f92f91a0b3800ab3f286ca9eeefee44327208e..512f266096b1bff8545108685b685174cc0ee829 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -1408,7 +1408,10 @@ static void native_static_service_thread(void* arg)
 	SAFEPRINTF(fullcmd,cmd,socket_dup);
 
 	do {
-		system(fullcmd);
+		int result = system(fullcmd);
+		if(result != 0)
+			lprintf(LOG_ERR, "%04d %s '%s' returned %d"
+				,inst.socket, inst.service->protocol, fullcmd, result);
 	} while(!inst.service->terminated && inst.service->options&SERVICE_OPT_STATIC_LOOP);
 
 	thread_down();
@@ -1541,7 +1544,10 @@ static void native_service_thread(void* arg)
 		SAFECOPY(cmd,service->cmd);
 	SAFEPRINTF(fullcmd,cmd,socket_dup);
 
-	system(fullcmd);
+	int result = system(fullcmd);
+	if(result != 0)
+		lprintf(LOG_ERR, "%04d %s '%s' returned %d"
+			,socket, service->protocol, fullcmd, result);
 
 	ulong remain = protected_uint32_adjust(&service->clients, -1);
 	update_clients();
diff --git a/src/sbbs3/ssl.c b/src/sbbs3/ssl.c
index 8f0588826db70134c6140c28952ffde251d7225c..bcd11595e1c0221f8713abfe508ea70f62f40180 100644
--- a/src/sbbs3/ssl.c
+++ b/src/sbbs3/ssl.c
@@ -218,12 +218,15 @@ bool get_crypt_error_string(int status, CRYPT_HANDLE sess, char **estr, const ch
 			}
 		}
 		if (emsg) {
-			asprintf(estr, "%s '%s' (%d) %s", crypt_lstr(level), emsg, status, action);
+			if(asprintf(estr, "%s '%s' (%d) %s", crypt_lstr(level), emsg, status, action) < 0)
+				*estr = '\0';
 			if (allocated)
 				free_crypt_attrstr(emsg);
 		}
-		else
-			asprintf(estr, "%s (%d) %s", crypt_lstr(level), status, action);
+		else {
+			if(asprintf(estr, "%s (%d) %s", crypt_lstr(level), status, action) < 0)
+				*estr = '\0';
+		}
 	}
 	return false;
 }
diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp
index 47ce00a052a83873a426fb707840e521c74fd8eb..687d0240a515ad719a2c08a86e682164f60e24dd 100644
--- a/src/sbbs3/str.cpp
+++ b/src/sbbs3/str.cpp
@@ -451,8 +451,10 @@ void sbbs_t::create_sif_dat(char *siffile, char *datfile)
 		errormsg(WHERE,ERR_OPEN,datfile,O_WRONLY|O_TRUNC|O_CREAT);
 		return; 
 	}
-	write(file,buf,strlen(buf));
+	int wr = write(file,buf,strlen(buf));
 	close(file);
+	if(wr < 0)
+		errormsg(WHERE, ERR_WRITE, datfile, strlen(buf));
 	free(buf);
 }
 
@@ -479,7 +481,9 @@ void sbbs_t::read_sif_dat(char *siffile, char *datfile)
 		errormsg(WHERE,ERR_ALLOC,datfile,length);
 		return; 
 	}
-	read(file,buf,length);
+	length = read(file,buf,length);
+	if(length < 0)
+		length = 0;
 	close(file);
 	sof(siffile,buf,length);
 	free(buf);
diff --git a/src/sbbs3/telgate.cpp b/src/sbbs3/telgate.cpp
index e3f3a927e01e8a234c816fb6fb74c52185d6444c..c0d8a63b44642746ccea3c796348a12e3b4975f5 100644
--- a/src/sbbs3/telgate.cpp
+++ b/src/sbbs3/telgate.cpp
@@ -119,7 +119,8 @@ bool sbbs_t::telnet_gate(char* destaddr, uint mode, unsigned timeout, char* clie
 			p+=sprintf(p,"%s/%u",terminal, cur_rate);
 		p++;	// Add NULL
 		l=p-(char*)buf;
-		(void)sendsocket(remote_socket,(char*)buf,l);
+		if(sendsocket(remote_socket,(char*)buf,l) != (ssize_t)l)
+			lprintf(LOG_WARNING, "Error %d sending %lu bytes to server: %s", ERROR_VALUE, l, destaddr);
 		mode|=TG_NOLF;	/* Send LF (to remote host) when Telnet client sends CRLF (when not in binary mode) */
 	}
 
diff --git a/src/sbbs3/umonitor/chat.c b/src/sbbs3/umonitor/chat.c
index 3cab69648a6b74b87c20805d92e8a2746811c519..90b33214f6b34878838122e301b26b0e3a59f543 100644
--- a/src/sbbs3/umonitor/chat.c
+++ b/src/sbbs3/umonitor/chat.c
@@ -1,9 +1,5 @@
-/* chat.c */
-
 /* Synchronet for *nix sysop chat routines */
 
-/* $Id: chat.c,v 1.21 2019/08/31 22:33:26 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -169,8 +153,11 @@ int chat(scfg_t *cfg, int nodenum, node_t *node, box_t *boxch, void(*timecallbac
 	drawchatwin(boxch,usrname,cfg->sys_op);
 
 	memset(p,0,PCHAT_LEN);
-	write(in,p,PCHAT_LEN);
-	write(out,p,PCHAT_LEN);
+	if(write(in,p,PCHAT_LEN) != PCHAT_LEN || write(out,p,PCHAT_LEN) != PCHAT_LEN) {
+		close(in);
+		close(out);
+		return __LINE__;
+	}
 	lseek(in,0,SEEK_SET);
 	lseek(out,0,SEEK_SET);
 
@@ -226,7 +213,8 @@ int chat(scfg_t *cfg, int nodenum, node_t *node, box_t *boxch, void(*timecallbac
 					if(ch) {
 						chatchar(&uwin,ch);
 						ch=0;
-						write(in,&ch,1);
+						if(write(in,&ch,1) != 1)
+							perror("reading chat in");
 						continue;
 					}
 					break;
diff --git a/src/sbbs3/umonitor/spyon.c b/src/sbbs3/umonitor/spyon.c
index 5405f2d4054463d14dc58e5b4f6e53fa272ade71..1ca508a0333bbe79d05021b923b9c07a8fb835df 100644
--- a/src/sbbs3/umonitor/spyon.c
+++ b/src/sbbs3/umonitor/spyon.c
@@ -1,9 +1,5 @@
-/* spyon.c */
-
 /* Synchronet for *nix node spy */
 
-/* $Id: spyon.c,v 1.16 2020/06/30 18:30:40 deuce Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -17,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -157,7 +141,8 @@ int spyon(char *sockname)  {
 					retval=SPY_CLOSED;
 					break;
 				default:
-					write(spy_sock,&key,1);
+					if(write(spy_sock,&key,1) != 1)
+						perror("writing to spy socket");
 			}
 		}
 	}
diff --git a/src/sbbs3/umonitor/umonitor.c b/src/sbbs3/umonitor/umonitor.c
index e8b0ef8d0069655d2a20604dc033c72a141be256..98e440cab1efa357cf89367a5fcbd8797fec536c 100644
--- a/src/sbbs3/umonitor/umonitor.c
+++ b/src/sbbs3/umonitor/umonitor.c
@@ -417,7 +417,8 @@ int view_log(char *filename, char *title)
 		if((buffile=sopen(filename,O_RDONLY,SH_DENYWR))>=0) {
 			j=filelength(buffile);
 			if(j >= 0 && (buf=(char *)malloc(j+1))!=NULL) {
-				read(buffile,buf,j);
+				if(read(buffile,buf,j) != j)
+					j = 0;
 				close(buffile);
 				*(buf+j)=0;
 				uifc.showbuf(WIN_MID,0,0,76,uifc.scrn_len-2,title,buf,NULL,NULL);
diff --git a/src/sbbs3/un_rep.cpp b/src/sbbs3/un_rep.cpp
index 1d3571d0ed8c6adaa43f1d3720b9ed3991738427..e0ff6d1c7bd820a4855703f5c1f1e28cf2f61fbe 100644
--- a/src/sbbs3/un_rep.cpp
+++ b/src/sbbs3/un_rep.cpp
@@ -149,7 +149,9 @@ bool sbbs_t::unpack_rep(char* repfile)
 		remove(fname);
 	}
 
-	fread(block,QWK_BLOCK_LEN,1,rep);
+	if(fread(block,QWK_BLOCK_LEN,1,rep) != 1)
+		errormsg(WHERE, ERR_READ, repfile, QWK_BLOCK_LEN);
+
 	if(strnicmp((char *)block,cfg.sys_id,strlen(cfg.sys_id))) {
 		iniFreeStringList(headers);
 		iniFreeStringList(voting);
diff --git a/src/sbbs3/unbaja.c b/src/sbbs3/unbaja.c
index 53464e1af3e6984924306a67b0a12467a7a19492..84766b46861c9daf8204cdd8e7e08e97b6b3ed02 100644
--- a/src/sbbs3/unbaja.c
+++ b/src/sbbs3/unbaja.c
@@ -352,11 +352,19 @@ char *getvar(long name)
 	return(varname);
 }
 
+size_t my_fread(void* buf, size_t size, size_t n, FILE* fp)
+{
+	size_t result = fread(buf, size, n, fp);
+	if(result != n)
+		perror("reading file");
+	return result;
+}
+
 void write_var(FILE *bin, char *src)
 {
 	int32_t lng;
 
-	fread(&lng, 1, 4, bin);
+	my_fread(&lng, 1, 4, bin);
 	sprintf(strchr(src,0),"%s ",getvar(lng));
 }
 
@@ -366,7 +374,7 @@ void write_cstr(FILE *bin, char *src)
 	char* p;
 
 	strcat(src,"\"");
-	while(fread(&ch,1,1,bin)==1) {
+	while(my_fread(&ch,1,1,bin)==1) {
 		if(ch==0)
 			break;
 		if((p=c_escape_char(ch))!=NULL)
@@ -383,7 +391,7 @@ void write_lng(FILE *bin, char *src)
 {
 	int32_t lng;
 
-	fread(&lng,4,1,bin);
+	my_fread(&lng,4,1,bin);
 	sprintf(strchr(src,0),"%"PRId32" ",lng);
 }
 
@@ -391,7 +399,7 @@ void write_short(FILE *bin, char *src)
 {
 	int16_t sht;
 
-	fread(&sht,2,1,bin);
+	my_fread(&sht,2,1,bin);
 	sprintf(strchr(src,0),"%d ",sht);
 }
 
@@ -399,7 +407,7 @@ void write_ushort(FILE *bin, char *src)
 {
 	uint16_t sht;
 
-	fread(&sht,2,1,bin);
+	my_fread(&sht,2,1,bin);
 	sprintf(strchr(src,0),"%d ",sht);
 }
 
@@ -407,7 +415,7 @@ void write_ch(FILE *bin, char *src)
 {
 	char ch;
 
-	fread(&ch,1,1,bin);
+	my_fread(&ch,1,1,bin);
 	sprintf(strchr(src,0),"%c ",ch);
 }
 
@@ -415,14 +423,14 @@ void write_uchar(FILE *bin, char *src)
 {
 	uchar uch;
 
-	fread(&uch,1,1,bin);
+	my_fread(&uch,1,1,bin);
 	sprintf(strchr(src,0),"%u ",uch);
 }
 
 void write_logic(FILE *bin, char *src)
 {
 	char ch;
-	fread(&ch,1,1,bin);
+	my_fread(&ch,1,1,bin);
 	if(ch==LOGIC_TRUE)
 		strcat(src,"TRUE ");
 	else
@@ -432,7 +440,7 @@ void write_logic(FILE *bin, char *src)
 int write_key(FILE *bin, char *src, int keyset)
 {
 	uchar uch;
-	fread(&uch,1,1,bin);
+	my_fread(&uch,1,1,bin);
 	if(uch==0 && keyset)
 		return(uch);
 	if(uch==CS_DIGIT)
@@ -590,7 +598,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,1,1,bin); \
+							my_fread(buf,1,1,bin); \
 						} else {				 \
 							write_uchar(bin,src);  \
 						}					 \
@@ -601,7 +609,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,2,1,bin); \
+							my_fread(buf,2,1,bin); \
 						} else {				 \
 							write_short(bin,src);  \
 						}					 \
@@ -613,7 +621,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,4,1,bin); \
+							my_fread(buf,4,1,bin); \
 						} else {				 \
 							write_lng(bin,src);  \
 						}					 \
@@ -626,7 +634,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,1,1,bin); \
+							my_fread(buf,1,1,bin); \
 						} else {				 \
 							write_uchar(bin,src);		 \
 						}					 \
@@ -638,7 +646,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,2,1,bin); \
+							my_fread(buf,2,1,bin); \
 						} else {				 \
 							write_short(bin,src);  \
 						}					 \
@@ -650,7 +658,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,1,1,bin); \
+							my_fread(buf,1,1,bin); \
 						} else {				 \
 							write_uchar(bin,src);  \
 						}					 \
@@ -663,9 +671,9 @@ void eol(char *src)
 							if(usevar) {		 \
 								sprintf(strchr(src,0),"%s ",getvar(var)); \
 								usevar=FALSE;	 \
-								fread(buf,2,1,bin); \
+								my_fread(buf,2,1,bin); \
 							} else {				 \
-								fread(&ush, 2, 1, bin); \
+								my_fread(&ush, 2, 1, bin); \
 								if(ush)					\
 									sprintf(strchr(src,0),"%u ",ush);  \
 							}					 \
@@ -678,7 +686,7 @@ void eol(char *src)
 							if(usevar) {		 \
 								sprintf(strchr(src,0),"%s ",getvar(var)); \
 								usevar=FALSE;	 \
-								fread(buf,2,1,bin); \
+								my_fread(buf,2,1,bin); \
 							} else {				 \
 								write_ushort(bin,src);  \
 							}					 \
@@ -690,7 +698,7 @@ void eol(char *src)
 							if(usevar) {		 \
 								sprintf(strchr(src,0),"%s ",getvar(var)); \
 								usevar=FALSE;	 \
-								fread(buf,2,1,bin); \
+								my_fread(buf,2,1,bin); \
 							} else {				 \
 								write_ushort(bin,src);  \
 							}					 \
@@ -703,7 +711,7 @@ void eol(char *src)
 							if(usevar) {		 \
 								sprintf(strchr(src,0),"%s ",getvar(var)); \
 								usevar=FALSE;	 \
-								fread(buf,2,1,bin); \
+								my_fread(buf,2,1,bin); \
 							} else {				 \
 								write_ushort(bin,src);  \
 							}					 \
@@ -715,7 +723,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,4,1,bin); \
+							my_fread(buf,4,1,bin); \
 						} else {				 \
 							write_lng(bin,src);  \
 						}					 \
@@ -726,7 +734,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,4,1,bin); \
+							my_fread(buf,4,1,bin); \
 						} else {				 \
 							write_lng(bin,src);  \
 						}					 \
@@ -738,7 +746,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,2,1,bin); \
+							my_fread(buf,2,1,bin); \
 						} else {				 \
 							write_short(bin,src);  \
 						}					 \
@@ -750,7 +758,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,4,1,bin); \
+							my_fread(buf,4,1,bin); \
 						} else {				 \
 							write_lng(bin,src);  \
 						}					 \
@@ -763,7 +771,7 @@ void eol(char *src)
 							if(usevar) {		 \
 								sprintf(strchr(src,0),"%s ",getvar(var)); \
 								usevar=FALSE;	 \
-								fread(buf,4,1,bin); \
+								my_fread(buf,4,1,bin); \
 							} else {				 \
 								write_lng(bin,src);  \
 							}					 \
@@ -776,7 +784,7 @@ void eol(char *src)
 							if(usevar) {		 \
 								sprintf(strchr(src,0),"%s ",getvar(var)); \
 								usevar=FALSE;	 \
-								fread(buf,1,1,bin); \
+								my_fread(buf,1,1,bin); \
 							} else {				 \
 								write_uchar(bin,src);  \
 							}					 \
@@ -789,7 +797,7 @@ void eol(char *src)
 						if(usevar) {		 \
 							sprintf(strchr(src,0),"%s ",getvar(var)); \
 							usevar=FALSE;	 \
-							fread(buf,1,1,bin); \
+							my_fread(buf,1,1,bin); \
 						} else {				 \
 							write_ch(bin,src);  \
 						}					 \
@@ -1341,7 +1349,7 @@ void decompile(FILE *bin, FILE *srcfile)
 	while(1) {
 		currpos=ftell(bin);
 
-		if(fread(&uch,1,1,bin)!=1) {
+		if(my_fread(&uch,1,1,bin)!=1) {
 			if(redo)
 				break;
 			redo=TRUE;
@@ -1355,11 +1363,11 @@ void decompile(FILE *bin, FILE *srcfile)
 		switch(uch) {
 			case CS_USE_INT_VAR:
 				usevar=TRUE;
-				fread(&var,4,1,bin);
-				fread(&buf,2,1,bin);	/* offset/length */
+				my_fread(&var,4,1,bin);
+				my_fread(&buf,2,1,bin);	/* offset/length */
 				continue;
 			case CS_VAR_INSTRUCTION:
-				fread(&uch,1,1,bin);
+				my_fread(&uch,1,1,bin);
 				switch(uch) {
 					case SHOW_VARS:
 						WRITE_NAME("SHOW_VARS");
@@ -1376,7 +1384,7 @@ void decompile(FILE *bin, FILE *srcfile)
 							WRITE_NAME("LPRINTF");
 						}
 						write_cstr(bin,src);
-						fread(&uch, 1, 1, bin);
+						my_fread(&uch, 1, 1, bin);
 						for(i=0; i<uch; i++) {
 							write_var(bin,src);
 						}
@@ -1420,7 +1428,7 @@ void decompile(FILE *bin, FILE *srcfile)
 						WRITE_NAME("SPRINTF");
 						write_var(bin,src);
 						write_cstr(bin,src);
-						fread(&uch, 1, 1, bin);
+						my_fread(&uch, 1, 1, bin);
 						for(i=0; i<uch; i++) {
 							write_var(bin,src);
 						}
@@ -1532,7 +1540,7 @@ void decompile(FILE *bin, FILE *srcfile)
 						CHVAR("RECEIVE_FILE_VIA");
 					case TELNET_GATE_STR:				/* TELNET_GATE reverses argument order */
 						WRITE_NAME("TELNET_GATE");
-						fread(&lng,4,1,bin);
+						my_fread(&lng,4,1,bin);
 						write_cstr(bin,src);
 						if(usevar) {
 							sprintf(strchr(src,0),"%s ",getvar(var));
@@ -1544,8 +1552,8 @@ void decompile(FILE *bin, FILE *srcfile)
 						break;
 					case TELNET_GATE_VAR:				/* TELNET_GATE reverses argument order */
 						WRITE_NAME("TELNET_GATE");
-						fread(&lng,4,1,bin);
-						fread(&lng2, 1, 4, bin);
+						my_fread(&lng,4,1,bin);
+						my_fread(&lng2, 1, 4, bin);
 						sprintf(strchr(src,0),"%s ",getvar(lng2));
 						if(usevar) {
 							sprintf(strchr(src,0),"%s ",getvar(var));
@@ -1682,7 +1690,7 @@ void decompile(FILE *bin, FILE *srcfile)
 			case CS_GETCHAR:
 				NONE("GETCHAR");
 			case CS_ONE_MORE_BYTE:
-				fread(&uch,1,1,bin);
+				my_fread(&uch,1,1,bin);
 				switch(uch) {
 					case CS_ONLINE:
 						NONE("ONLINE");
@@ -1743,7 +1751,7 @@ void decompile(FILE *bin, FILE *srcfile)
 			case CS_MULTINODE_CHAT:
 				MUCH("MULTINODE_CHAT");
 			case CS_TWO_MORE_BYTES:
-				fread(&uch,1,1,bin);
+				my_fread(&uch,1,1,bin);
 				switch(uch) {
 					case CS_USER_EVENT:
 						MUCH("USER_EVENT");
@@ -1752,14 +1760,14 @@ void decompile(FILE *bin, FILE *srcfile)
 				}
 				break;
 			case CS_GOTO:
-				fread(&ush,2,1,bin);
+				my_fread(&ush,2,1,bin);
 				labels[ush]=TRUE;
 				WRITE_NAME("GOTO");
 				sprintf(strchr(src,0),"label_%04x ",ush);
 				eol(src);
 				break;
 			case CS_CALL:
-				fread(&ush,2,1,bin);
+				my_fread(&ush,2,1,bin);
 				labels[ush]=TRUE;
 				WRITE_NAME("CALL");
 				sprintf(strchr(src,0),"label_%04x ",ush);
@@ -1847,7 +1855,7 @@ void decompile(FILE *bin, FILE *srcfile)
 			case CS_COMPARE_KEYS:
 				KEYS("COMPARE_KEYS");
 			case CS_STR_FUNCTION:
-				fread(&uch,1,1,bin);
+				my_fread(&uch,1,1,bin);
 				switch(uch) {
 					case CS_LOGIN:
 						STR("LOGIN");
@@ -1856,13 +1864,13 @@ void decompile(FILE *bin, FILE *srcfile)
 					default:
 						printf("ERROR!  Unknown string instruction: %02x%02X\n",CS_STR_FUNCTION,uch);
 						ch=0;
-						while(ch) fread(&ch,1,1,bin);
+						while(ch) my_fread(&ch,1,1,bin);
 				}
 				break;
 			case CS_COMPARE_ARS:
-				fread(&uch,1,1,bin);
+				my_fread(&uch,1,1,bin);
 				if((p=(char *)malloc(uch)) != NULL) {
-					fread(p,uch,1,bin);
+					my_fread(p,uch,1,bin);
 					WRITE_NAME("COMPARE_ARS");
 					sprintf(strchr(src,0),"%s\n",decompile_ars((uchar*)p,uch));
 					free(p);
@@ -1889,7 +1897,7 @@ void decompile(FILE *bin, FILE *srcfile)
 				indenteol=1;
 				LNG("CASE");
 			case CS_NET_FUNCTION:
-				fread(&uch,1,1,bin);
+				my_fread(&uch,1,1,bin);
 				switch(uch) {
 					case CS_SOCKET_OPEN:
 						VAR("SOCKET_OPEN");
@@ -1937,7 +1945,7 @@ void decompile(FILE *bin, FILE *srcfile)
 				}
 				break;
 			case CS_FIO_FUNCTION:
-				fread(&uch,1,1,bin);
+				my_fread(&uch,1,1,bin);
 				switch(uch) {
 					case FIO_OPEN:
 						MVARUSTSTR("FOPEN");
@@ -1961,7 +1969,7 @@ void decompile(FILE *bin, FILE *srcfile)
 						WRITE_NAME("FSET_POS");
 						write_var(bin,src);
 						write_lng(bin,src);
-						fread(&ush,2,1,bin);
+						my_fread(&ush,2,1,bin);
 						if(ush==SEEK_CUR)
 							strcat(src,"CUR ");
 						else if(ush==SEEK_END)
@@ -1974,7 +1982,7 @@ void decompile(FILE *bin, FILE *srcfile)
 						WRITE_NAME("FSET_POS");
 						write_var(bin,src);
 						write_var(bin,src);
-						fread(&ush,2,1,bin);
+						my_fread(&ush,2,1,bin);
 						if(ush==SEEK_CUR)
 							strcat(src,"CUR ");
 						else if(ush==SEEK_END)
@@ -1999,7 +2007,7 @@ void decompile(FILE *bin, FILE *srcfile)
 						WRITE_NAME("FPRINTF");
 						write_var(bin,src);
 						write_cstr(bin,src);
-						fread(&uch, 1, 1, bin);
+						my_fread(&uch, 1, 1, bin);
 						for(i=0; i<uch; i++) {
 							write_var(bin,src);
 						}
diff --git a/src/sbbs3/upgrade_to_v319.c b/src/sbbs3/upgrade_to_v319.c
index 724766ddab523b03a4b1a424135815ea80daeea6..ea80d8fa8defc75cba4060a83e2fd0fce511dae7 100644
--- a/src/sbbs3/upgrade_to_v319.c
+++ b/src/sbbs3/upgrade_to_v319.c
@@ -32,13 +32,30 @@ scfg_t scfg;
 BOOL overwrite_existing_files=TRUE;
 ini_style_t style = { 25, NULL, NULL, " = ", NULL };
 
+ssize_t my_write(int fd, const void* buf, size_t count)
+{
+	ssize_t wr = write(fd, buf, count);
+	if(wr != count)
+		perror("writing file");
+	return wr;
+}
+
+ssize_t my_read(int fd, void* buf, size_t count)
+{
+	ssize_t rd = read(fd, buf, count);
+	if(rd != count)
+		perror("reading file");
+	return rd;
+}
+
 BOOL overwrite(const char* path)
 {
 	char	str[128];
 
 	if(!overwrite_existing_files && fexist(path)) {
 		printf("\n%s already exists, overwrite? ",path);
-		fgets(str,sizeof(str),stdin);
+		if(fgets(str,sizeof(str),stdin) == NULL)
+			*str = '\0';
 		if(toupper(*str)!='Y')
 			return(FALSE);
 	}
@@ -428,8 +445,8 @@ BOOL putfileixb(scfg_t* cfg, oldfile_t* f)
 	
 	lseek(file,l+11+3,SEEK_SET);
 
-	write(file,&f->dateuled,4);
-	write(file,&f->datedled,4);
+	my_write(file,&f->dateuled,4);
+	my_write(file,&f->datedled,4);
 
 	close(file);
 
@@ -457,7 +474,7 @@ void getextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext)
 	if((file=openextdesc(cfg, dirnum))==-1)
 		return;
 	lseek(file,(datoffset/F_LEN)*F_EXBSIZE,SEEK_SET);
-	read(file,ext,F_EXBSIZE);
+	my_read(file,ext,F_EXBSIZE);
 	close(file);
 }
 
@@ -465,7 +482,7 @@ void getextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext)
 void fgetextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext, int file)
 {
 	lseek(file,(datoffset/F_LEN)*F_EXBSIZE,SEEK_SET);
-	read(file,ext,F_EXBSIZE);
+	my_read(file,ext,F_EXBSIZE);
 }
 
 void putextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext)
@@ -481,9 +498,9 @@ void putextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext)
 		return;
 	lseek(file,0L,SEEK_END);
 	while(filelength(file)<(long)(datoffset/F_LEN)*F_EXBSIZE)
-		write(file,nulbuf,sizeof(nulbuf));
+		my_write(file,nulbuf,sizeof(nulbuf));
 	lseek(file,(datoffset/F_LEN)*F_EXBSIZE,SEEK_SET);
-	write(file,ext,F_EXBSIZE);
+	my_write(file,ext,F_EXBSIZE);
 	close(file);
 }
 
@@ -511,7 +528,7 @@ int update_uldate(scfg_t* cfg, oldfile_t* f)
 	for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
 		fname[i]=fname[i+1];
 	for(l=0;l<length;l+=F_IXBSIZE) {
-		read(file,str,F_IXBSIZE);      /* Look for the filename in the IXB file */
+		my_read(file,str,F_IXBSIZE);      /* Look for the filename in the IXB file */
 		str[11]=0;
 		if(!stricmp(fname,str)) break; 
 	}
@@ -520,7 +537,7 @@ int update_uldate(scfg_t* cfg, oldfile_t* f)
 		return(-2); 
 	}
 	lseek(file,l+14,SEEK_SET);
-	write(file,&f->dateuled,4);
+	my_write(file,&f->dateuled,4);
 	close(file);
 
 	/*******************************************/
@@ -530,7 +547,7 @@ int update_uldate(scfg_t* cfg, oldfile_t* f)
 	if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
 		return(errno);
 
-	write(file,&f->dateuled,4);
+	my_write(file,&f->dateuled,4);
 	close(file); 
 	return(0);
 }
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index ecb19d40a8a807409d3ce02eb4926577fb8b5ad1..0cd3e2bf641b280922bde65c5d6d4deb971dc1b2 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -100,7 +100,8 @@ uint matchuser(scfg_t* cfg, const char *name, BOOL sysop_alias)
 		return 0;
 	}
 	for(l = 0; l < length; l += sizeof(dat)) {
-		(void)fread(dat,sizeof(dat),1,stream);
+		if(fread(dat,sizeof(dat),1,stream) != 1)
+			break;
 		for(c=0;c<LEN_ALIAS;c++)
 			if(dat[c]==ETX) break;
 		dat[c]=0;
@@ -232,9 +233,9 @@ BOOL del_lastuser(scfg_t* cfg)
 		close(file);
 		return(FALSE);
 	}
-	chsize(file, (long)length - USER_RECORD_LINE_LEN);
+	int result = chsize(file, (long)length - USER_RECORD_LINE_LEN);
 	close(file);
-	return(TRUE);
+	return result == 0;
 }
 
 /****************************************************************************/
@@ -835,7 +836,8 @@ char* username(scfg_t* cfg, int usernumber, char *name)
 		return(name);
 	}
 	(void)lseek(file,(long)((long)(usernumber-1)*(LEN_ALIAS+2)),SEEK_SET);
-	(void)read(file,name,LEN_ALIAS);
+	if(read(file,name,LEN_ALIAS) != LEN_ALIAS)
+		memset(name, ETX, LEN_ALIAS);
 	close(file);
 	for(c=0;c<LEN_ALIAS;c++)
 		if(name[c]==ETX) break;
@@ -866,8 +868,12 @@ int putusername(scfg_t* cfg, int number, const char *name)
 
 	/* Truncate corrupted name.dat */
 	total_users=lastuser(cfg);
-	if(length/(LEN_ALIAS+2) > total_users)
-		chsize(file,(long)(total_users*(LEN_ALIAS+2)));
+	if(length/(LEN_ALIAS+2) > total_users) {
+		if(chsize(file,(long)(total_users*(LEN_ALIAS+2))) != 0) {
+			close(file);
+			return -4;
+		}
+	}
 
 	if(length && length%(LEN_ALIAS+2)) {
 		close(file);
@@ -878,7 +884,8 @@ int putusername(scfg_t* cfg, int number, const char *name)
 		memset(str,ETX,LEN_ALIAS);
 		(void)lseek(file,0L,SEEK_END);
 		while((length = filelength(file)) >= 0 && length < ((long)number*(LEN_ALIAS+2)))	// Shouldn't this be (number-1)?
-			(void)write(file,str,(LEN_ALIAS+2));
+			if(write(file,str,(LEN_ALIAS+2)) != LEN_ALIAS+2)
+				break;
 	}
 	(void)lseek(file,(long)(((long)number-1)*(LEN_ALIAS+2)),SEEK_SET);
 	putrec(str,0,LEN_ALIAS,name);
@@ -1227,7 +1234,8 @@ char* getnodeext(scfg_t* cfg, int num, char* buf)
 	if((f = opennodeext(cfg)) < 1)
 		return "";
 	(void)lseek(f, (num-1) * 128, SEEK_SET);
-	(void)read(f, buf, 128);
+	if(read(f, buf, 128) != 128)
+		memset(buf, 0, 128);
 	close(f);
 	buf[127] = 0;
 	return buf;
@@ -1597,12 +1605,11 @@ char* readsmsg(scfg_t* cfg, int usernumber)
 		close(file);
 		return(NULL);
 	}
-	if(read(file,buf,length)!=length) {
+	if(read(file,buf,length)!=length || chsize(file, 0) != 0) {
 		close(file);
 		free(buf);
 		return(NULL);
 	}
-	chsize(file,0L);
 	close(file);
 	buf[length]=0;
 	strip_invalid_attr(buf);
@@ -1610,8 +1617,12 @@ char* readsmsg(scfg_t* cfg, int usernumber)
 	SAFEPRINTF2(str, "%smsgs/%4.4u.last.msg", cfg->data_dir, usernumber);
 	backup(str, 19, /* rename: */true);
 	if((file = nopen(str, O_WRONLY|O_CREAT|O_APPEND)) != -1) {
-		(void)write(file, buf, length);
+		int wr = write(file, buf, length);
 		close(file);
+		if(wr != length) {
+			free(buf);
+			return NULL;
+		}
 	}
 
 	return(buf);	/* caller must free */
@@ -1647,12 +1658,11 @@ char* getnmsg(scfg_t* cfg, int node_num)
 		close(file);
 		return(NULL);
 	}
-	if(read(file,buf,length)!=length) {
+	if(read(file,buf,length)!=length || chsize(file, 0) != 0) {
 		close(file);
 		free(buf);
 		return(NULL);
 	}
-	chsize(file,0L);
 	close(file);
 	buf[length]=0;
 
@@ -3049,7 +3059,8 @@ int newuserdat(scfg_t* cfg, user_t* user)
 		}
 		last=(long)filelength(file)/(LEN_ALIAS+2);	   /* total users */
 		while(unum<=last) {
-			fread(str,LEN_ALIAS+2,1,stream);
+			if(fread(str,LEN_ALIAS+2,1,stream) != 1)
+				memset(str, ETX, LEN_ALIAS);
 			for(c=0;c<LEN_ALIAS;c++)
 				if(str[c]==ETX) break;
 			str[c]=0;
@@ -3884,9 +3895,12 @@ BOOL getmsgptrs(scfg_t* cfg, user_t* user, subscan_t* subscan, void (*progress)(
 			progress(cbdata, i, cfg->total_subs);
 		if(length>=(cfg->sub[i]->ptridx+1)*10L) {
 			fseek(stream,(long)cfg->sub[i]->ptridx*10L,SEEK_SET);
-			fread(&subscan[i].ptr,sizeof(subscan[i].ptr),1,stream);
-			fread(&subscan[i].last,sizeof(subscan[i].last),1,stream);
-			fread(&subscan[i].cfg,sizeof(subscan[i].cfg),1,stream);
+			if(fread(&subscan[i].ptr,sizeof(subscan[i].ptr),1,stream) != 1)
+				break;
+			if(fread(&subscan[i].last,sizeof(subscan[i].last),1,stream) != 1)
+				break;
+			if(fread(&subscan[i].cfg,sizeof(subscan[i].cfg),1,stream) != 1)
+				break;
 		}
 		subscan[i].sav_ptr=subscan[i].ptr;
 		subscan[i].sav_last=subscan[i].last;
diff --git a/src/sbbs3/writemsg.cpp b/src/sbbs3/writemsg.cpp
index 14da204398ec140ac602bc002ccb2b7faf2f2cf9..1aeffc4ecf8d544d2daf9a5389ae9191d091858d 100644
--- a/src/sbbs3/writemsg.cpp
+++ b/src/sbbs3/writemsg.cpp
@@ -238,8 +238,10 @@ int sbbs_t::process_edited_file(const char* src, const char* dest, int mode, uns
 	}
 
 	memset(buf,0,len+1);
-	fread(buf,len,sizeof(char),fp);
+	int rd = fread(buf,len,1,fp);
 	fclose(fp);
+	if(rd != 1)
+		return -4;
 
 	if((fp=fopen(dest,"wb"))!=NULL) {
 		len=process_edited_text(buf, fp, mode, lines, maxlines);
@@ -261,6 +263,7 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, int mode,
 {
 	char	str[256],quote[128],c,*buf,*p,*tp
 				,useron_level;
+	char	path[MAX_PATH+1];
 	char	msgtmp[MAX_PATH+1];
 	char	tagfile[MAX_PATH+1];
 	char	draft_desc[128];
@@ -325,15 +328,17 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, int mode,
 		/* Quote entire message to MSGTMP or INPUT.MSG */
 
 		if(useron_xedit && cfg.xedit[useron_xedit-1]->misc&QUOTEALL) {
-			quotes_fname(useron_xedit, str, sizeof(str));
-			if((stream=fnopen(NULL,str,O_RDONLY))==NULL) {
-				errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
+			quotes_fname(useron_xedit, path, sizeof(path));
+			if((stream=fnopen(NULL,path,O_RDONLY))==NULL) {
+				errormsg(WHERE,ERR_OPEN,path,O_RDONLY);
 				free(buf);
-				return(false); 
+				return(false);
 			}
 			if(cfg.xedit[useron_xedit - 1]->type == XTRN_WWIV) { // 2 lines of metadata
-				fgets(str, sizeof(str), stream);
-				fgets(str, sizeof(str), stream);
+				if(fgets(str, sizeof(str), stream) == NULL)
+					errormsg(WHERE, ERR_READ, path, sizeof(str));
+				if(fgets(str, sizeof(str), stream) == NULL)
+					errormsg(WHERE, ERR_READ, path, sizeof(str));
 			}
 			if((file=nopen(msgtmp,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
 				errormsg(WHERE,ERR_OPEN,msgtmp,O_WRONLY|O_CREAT|O_TRUNC);
@@ -347,8 +352,8 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, int mode,
 					break;
 				quotestr(str);
 				SAFEPRINTF2(tmp,quote_fmt,cols-4,str);
-				write(file,tmp,strlen(tmp));
-				linesquoted++; 
+				if(write(file,tmp,strlen(tmp)) > 0)
+					linesquoted++;
 			}
 			fclose(stream);
 			close(file); 
@@ -360,16 +365,18 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, int mode,
 			;
 
 		else if(yesno(text[QuoteMessageQ])) {
-			quotes_fname(useron_xedit, str, sizeof(str));
-			if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
-				errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
+			quotes_fname(useron_xedit, path, sizeof(path));
+			if((stream=fnopen(&file,path,O_RDONLY))==NULL) {
+				errormsg(WHERE,ERR_OPEN,path,O_RDONLY);
 				free(buf);
 				return(false); 
 			}
 
 			if(useron_xedit > 0 && cfg.xedit[useron_xedit - 1]->type == XTRN_WWIV) { // 2 lines of metadata
-				fgets(str, sizeof(str), stream);
-				fgets(str, sizeof(str), stream);
+				if(fgets(str, sizeof(str), stream) == NULL)
+					errormsg(WHERE, ERR_READ, path, sizeof(str));
+				if(fgets(str, sizeof(str), stream) == NULL)
+					errormsg(WHERE, ERR_READ, path, sizeof(str));
 			}
 
 			if((file=nopen(msgtmp,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
@@ -400,8 +407,8 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, int mode,
 							break;
 						quotestr(str);
 						SAFEPRINTF2(tmp,quote_fmt,cols-4,str);
-						write(file,tmp,strlen(tmp));
-						linesquoted++; 
+						if(write(file,tmp,strlen(tmp)) > 0)
+							linesquoted++;
 					}
 					break; 
 				}
@@ -444,8 +451,8 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, int mode,
 								break;
 							quotestr(str);
 							SAFEPRINTF2(tmp,quote_fmt,cols-4,str);
-							write(file,tmp,strlen(tmp));
-							linesquoted++;
+							if(write(file,tmp,strlen(tmp)) > 0)
+								linesquoted++;
 							j++; 
 						} 
 					}
@@ -453,8 +460,8 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, int mode,
 						if(fgets(str,sizeof(str),stream)) {
 							quotestr(str);
 							SAFEPRINTF2(tmp,quote_fmt,cols-4,str);
-							write(file,tmp,strlen(tmp));
-							linesquoted++; 
+							if(write(file,tmp,strlen(tmp)) > 0)
+								linesquoted++;
 						} 
 					}
 					p=strchr(p,',');
@@ -680,7 +687,8 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, int mode,
 				length=(long)filelength(file);
 				l=length>(cfg.level_linespermsg[useron_level]*MAX_LINE_LEN)-1
 					? (cfg.level_linespermsg[useron_level]*MAX_LINE_LEN)-1 : length;
-				read(file,buf,l);
+				if(read(file,buf,l) != l)
+					l = 0;
 				buf[l]=0;
 				close(file);
 				// remove(msgtmp);
@@ -1702,7 +1710,12 @@ bool sbbs_t::editmsg(smb_t* smb, smbmsg_t *msg)
 	setvbuf(instream,NULL,_IOFBF,FNOPEN_BUF_SIZE);
 	fseeko(smb->sdt_fp,offset,SEEK_SET);
 	xlat=XLAT_NONE;
-	fwrite(&xlat,2,1,smb->sdt_fp);
+	if(fwrite(&xlat,2,1,smb->sdt_fp) != 1) {
+		errormsg(WHERE, ERR_WRITE, smb->file, 2);
+		smb_unlocksmbhdr(smb);
+		smb_freemsgdat(smb,offset,length,1);
+		return false;
+	}
 	x=SDT_BLOCK_LEN-2;				/* Don't read/write more than 255 */
 	while(!feof(instream)) {
 		memset(buf,0,x);
@@ -1711,7 +1724,12 @@ bool sbbs_t::editmsg(smb_t* smb, smbmsg_t *msg)
 			break;
 		if(j>1 && (j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR)
 			buf[j-1]=buf[j-2]=0;	/* Convert to NULL */
-		fwrite(buf,j,1,smb->sdt_fp);
+		if(fwrite(buf,j,1,smb->sdt_fp) != 1) {
+			errormsg(WHERE, ERR_WRITE, smb->file, j);
+			smb_unlocksmbhdr(smb);
+			smb_freemsgdat(smb,offset,length,1);
+			return false;
+		}
 		x=SDT_BLOCK_LEN; 
 	}
 	fflush(smb->sdt_fp);
@@ -1733,7 +1751,7 @@ bool sbbs_t::movemsg(smbmsg_t* msg, uint subnum)
 	uint i;
 	int newgrp,newsub,storage;
 	off_t offset;
-	ulong length;
+	uint length;
 	smbmsg_t	newmsg=*msg;
 	smb_t		newsmb;
 
@@ -1755,7 +1773,11 @@ bool sbbs_t::movemsg(smbmsg_t* msg, uint subnum)
 	}
 
 	fseek(smb.sdt_fp,msg->hdr.offset,SEEK_SET);
-	fread(buf,length,1,smb.sdt_fp);
+	if(fread(buf,length,1,smb.sdt_fp) != 1) {
+		free(buf);
+		errormsg(WHERE, ERR_READ, smb.file, length);
+		return false;
+	}
 
 	SAFEPRINTF2(newsmb.file,"%s%s",cfg.sub[newsub]->data_dir,cfg.sub[newsub]->code);
 	newsmb.retry_time=cfg.smb_retry_time;
@@ -1819,10 +1841,17 @@ bool sbbs_t::movemsg(smbmsg_t* msg, uint subnum)
 	newmsg.hdr.version=smb_ver();
 
 	fseeko(newsmb.sdt_fp,offset,SEEK_SET);
-	fwrite(buf,length,1,newsmb.sdt_fp);
+	int wr = fwrite(buf,length,1,newsmb.sdt_fp);
 	fflush(newsmb.sdt_fp);
 	free(buf);
 
+	if(wr != 1) {
+		errormsg(WHERE, ERR_WRITE, newsmb.file, length);
+		smb_close(&newsmb);
+		smb_freemsg_dfields(&newsmb,&newmsg,1);
+		return false;
+	}
+
 	i=smb_addmsghdr(&newsmb,&newmsg,storage);	// calls smb_unlocksmbhdr() 
 	smb_close(&newsmb);
 
diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index f34a5d00db9b93efe9c776cf17fc5eca4b0f061d..51b8b982c6586284c995e0810f2a7fa0b897fe28 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -1694,7 +1694,8 @@ int sbbs_t::external(const char* cmdline, int mode, const char* startup_dir)
 		if(mode&EX_BG)	/* background execution, detach child */
 		{
 			lprintf(LOG_INFO,"Detaching external process");
-			daemon(TRUE,FALSE);
+			if(daemon(TRUE,FALSE) != 0)
+				lprintf(LOG_ERR, "!ERROR %d (%s) daemonizing: %s", errno, strerror(errno), argv[0]);
    	    }
 
 		if(!(mode&EX_NOLOG)) {
@@ -1740,8 +1741,10 @@ int sbbs_t::external(const char* cmdline, int mode, const char* startup_dir)
 
 			/* Input */
 			if(mode&EX_STDIN && RingBufFull(&inbuf)) {
-				if((wr=RingBufRead(&inbuf,buf,sizeof(buf)))!=0)
-					write(in_pipe[1],buf,wr);
+				if((wr=RingBufRead(&inbuf,buf,sizeof(buf)))!=0) {
+					if(write(in_pipe[1],buf,wr) != wr)
+						lprintf(LOG_ERR, "ERROR %d writing to pipe", errno);
+				}
 			}
 
 			bp=buf;
diff --git a/src/sbbs3/xtrn_sec.cpp b/src/sbbs3/xtrn_sec.cpp
index 1701515eb6aab0210d75fcd6a112e810d732858a..e7d4a5fd6e47bcafd9dcc03ddf73011353743484 100644
--- a/src/sbbs3/xtrn_sec.cpp
+++ b/src/sbbs3/xtrn_sec.cpp
@@ -1014,10 +1014,12 @@ void sbbs_t::moduserdat(uint xtrnnum)
 		fexistcase(path);
 		if((file=nopen(path,O_RDONLY))!=-1) {
 			lseek(file,361,SEEK_SET);
-			read(file,&useron.flags1,4); /* Flags */
+			if(read(file,&useron.flags1,4) != 4) /* Flags */
+				errormsg(WHERE, ERR_READ, path, 4);
 			putuserflags(useron.number, USER_FLAGS1, useron.flags1);
 			lseek(file,373,SEEK_SET);
-			read(file,&i,2);			/* SecLvl */
+			if(read(file,&i,2) != 2)		/* SecLvl */
+				errormsg(WHERE, ERR_READ, path, 2);
 			if(i<SYSOP_LEVEL) {
 				useron.level=(uint8_t)i;
 				putuserdec32(useron.number, USER_LEVEL, useron.level); 
@@ -1099,17 +1101,26 @@ void sbbs_t::moduserdat(uint xtrnnum)
 		fexistcase(path);
 		if((file=nopen(path,O_RDONLY))!=-1) {
 			lseek(file,39,SEEK_SET);
-			read(file,&c,1);
+			if(read(file,&c,1) != 1)
+				c = 0;
 			if(c==1) {	 /* file has been updated */
 				lseek(file,105,SEEK_CUR);	/* read security level */
-				read(file,&i,2);
+				if(read(file,&i,2) != 2) {
+					close(file);
+					errormsg(WHERE, ERR_READ, path, 2);
+					return;
+				}
 				i = LE_INT(i);
 				if(i<SYSOP_LEVEL) {
 					useron.level=(uint8_t)i;
 					putuserdec32(useron.number, USER_LEVEL, useron.level); 
 				}
 				lseek(file,75,SEEK_CUR);	/* read in expiration date */
-				read(file,&i,2);			/* convert from julian to unix */
+				if(read(file,&i,2) != 2) {	/* convert from julian to unix */
+					close(file);
+					errormsg(WHERE, ERR_READ, path, 2);
+					return;
+				}
 				i = LE_INT(i);
 				useron.expire=(time32_t)juliantounix(i);
 				putuserdatetime(useron.number, USER_EXPIRE, useron.expire); 
@@ -1146,7 +1157,8 @@ void sbbs_t::moduserdat(uint xtrnnum)
 				putuserdec32(useron.number, USER_LEVEL, useron.level); 
 			} 
 		}
-		fgets(str,81,stream);		 /* was transfer level, now ignored */
+		if(fgets(str,81,stream)	== NULL) /* was transfer level, now ignored */
+			*str = '\0';
 		if(fgets(str,81,stream)) {		/* flags #1 */
 			if(strchr(str,'-'))         /* remove flags */
 				useron.flags1&=~aftou32(str);
diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c
index d46511dc6927683a61c77ca1d4e3739f63e7c817..bfe0fbfb71f366a0f42f8604ececb1db7ae78813 100755
--- a/src/sbbs3/zmodem.c
+++ b/src/sbbs3/zmodem.c
@@ -659,7 +659,7 @@ int zmodem_send_zeof(zmodem_t* zm)
 
 int zmodem_recv_raw(zmodem_t* zm)
 {
-	int c;
+	int c = NOINP;
 	unsigned attempt;
 
 	for(attempt=0; attempt < zm->recv_timeout; attempt++) {
diff --git a/src/uifc/uifc32.c b/src/uifc/uifc32.c
index 38b7d7fdb5cd889469180ae0a46851171802a2de..47618aa566a349f2bbeeb28e5c9b39f60af9fd5d 100644
--- a/src/uifc/uifc32.c
+++ b/src/uifc/uifc32.c
@@ -2056,7 +2056,7 @@ int umsgf(char* fmt, ...)
 	char* buf = NULL;
 
 	va_start(va, fmt);
-    vasprintf(&buf, fmt, va);
+    retval = vasprintf(&buf, fmt, va);
     va_end(va);
 	if(buf != NULL) {
 		retval = umsg(buf);
@@ -2070,7 +2070,8 @@ static int yesno(int dflt, char* fmt, va_list va)
 	int retval;
 	char* buf = NULL;
 
-    vasprintf(&buf, fmt, va);
+    if(vasprintf(&buf, fmt, va) < 0)
+		return dflt;
 	if(buf == NULL)
 		return dflt;
 	retval = ulist(WIN_SAV|WIN_MID,0,0,0,&dflt,0,buf,api->yesNoOpts);
diff --git a/src/xpdev/genwrap.c b/src/xpdev/genwrap.c
index 5116ce8a8572191f42962f6832fb070701a31ba0..6c4be14a3731caf81b7b92f16378d24d1df04cf4 100644
--- a/src/xpdev/genwrap.c
+++ b/src/xpdev/genwrap.c
@@ -522,7 +522,8 @@ void xp_randomize(void)
 
 #if defined(HAS_DEV_URANDOM) && defined(URANDOM_DEV)
 	if((rf=open(URANDOM_DEV, O_RDONLY))!=-1) {
-		read(rf, &seed, sizeof(seed));
+		if(read(rf, &seed, sizeof(seed)) != sizeof seed)
+			seed = UINT_MAX;
 		close(rf);
 	}
 	else {
diff --git a/src/xpdev/xpmap.c b/src/xpdev/xpmap.c
index d0701f90220639770a31db901726cf3431c891c4..12f4b038ad0c81f28bf0de46d39ba992d1d5083b 100644
--- a/src/xpdev/xpmap.c
+++ b/src/xpdev/xpmap.c
@@ -56,6 +56,8 @@ struct xpmapping* xpmap(const char *filename, enum xpmap_type type)
 			mflags=MAP_PRIVATE;
 			mprot=PROT_READ|PROT_WRITE;
 			break;
+		default:
+			return NULL;
 	}
 
 	fd=open(filename, oflags);
diff --git a/src/xpdev/xpprintf.c b/src/xpdev/xpprintf.c
index 7f481e9cfee61fe4f56e83174515b03b832cce27..1d387301c7d2a8c37c02ae0cbd319e7948c784b3 100644
--- a/src/xpdev/xpprintf.c
+++ b/src/xpdev/xpprintf.c
@@ -1,10 +1,5 @@
-/* xpprintf.c */
-// vi: tabstop=4
-
 /* Deuce's vs[n]printf() replacement */
 
-/* $Id: xpprintf.c,v 1.62 2018/04/07 07:21:46 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -18,21 +13,9 @@
  * See the GNU Lesser General Public License for more details: lgpl.txt or	*
  * http://www.fsf.org/copyleft/lesser.html									*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/