diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index aa1b8607922dc3b813fcd7204c11f75b66b89c66..2dc943ea3ca3824ff88e40f00a87144b1223f0fc 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -1016,6 +1016,8 @@ long js_exec(const char *fname, char** args)
 		if((js_buf=realloc(js_buf,js_buflen+len))==NULL) {
 			lprintf(LOG_ERR,"!Error allocating %u bytes of memory"
 				,js_buflen+len);
+			if(fp!=stdin)
+				fclose(fp);
 			return(-1);
 		}
 		memcpy(js_buf+js_buflen,line,len);
diff --git a/src/sbbs3/listfile.cpp b/src/sbbs3/listfile.cpp
index 80c6bb526dd432352d069b9483a2b4e5bd4f30a7..869663d76ca8350899b3ea94fee956e786157881 100644
--- a/src/sbbs3/listfile.cpp
+++ b/src/sbbs3/listfile.cpp
@@ -294,7 +294,7 @@ int sbbs_t::listfiles(uint dirnum, const char *filespec, int tofile, long mode)
 				if(tofile) {
 					write(tofile,crlf,2);
 					sprintf(hdr,"%*s",c,nulstr);
-					memset(hdr,'�',c);
+					memset(hdr,0xC4,c);
 					strcat(hdr,crlf);
 					write(tofile,hdr,strlen(hdr)); 
 				}
@@ -302,7 +302,7 @@ int sbbs_t::listfiles(uint dirnum, const char *filespec, int tofile, long mode)
 					CRLF;
 					attr(cfg.color[clr_filelstline]);
 					while(c--)
-						outchar('�');
+						outchar('\xC4');
 					CRLF; 
 				} 
 			} 
@@ -1009,11 +1009,13 @@ int sbbs_t::listfileinfo(uint dirnum, char *filespec, long mode)
 		return(0);
 	l=(long)filelength(file);
 	if(!l) {
+		FREE_AND_NULL(usrxfrbuf);
 		close(file);
 		return(0); 
 	}
 	if((ixbbuf=(uchar *)malloc(l))==NULL) {
 		close(file);
+		FREE_AND_NULL(usrxfrbuf);
 		errormsg(WHERE,ERR_ALLOC,str,l);
 		return(0); 
 	}
diff --git a/src/sbbs3/load_cfg.c b/src/sbbs3/load_cfg.c
index ba24ff91a87ba1bb1101643c26b6627c4e697618..f97776690880bab3ef5c935517948782e7a2c363 100644
--- a/src/sbbs3/load_cfg.c
+++ b/src/sbbs3/load_cfg.c
@@ -349,6 +349,7 @@ BOOL read_attr_cfg(scfg_t* cfg, char* error)
 	if((cfg->color=malloc(MIN_COLORS))==NULL) {
 		sprintf(error,"Error allocating memory (%u bytes) for colors"
 			,MIN_COLORS);
+		fclose(instream);
 		return(FALSE);
 	}
 	/* Setup default colors here: */
diff --git a/src/sbbs3/logout.cpp b/src/sbbs3/logout.cpp
index 9fa9941ad6a47406811cc83f912ec073b8a828ad..8c577db1666ffdbe3d66a8cd0b9be796a28920a9 100644
--- a/src/sbbs3/logout.cpp
+++ b/src/sbbs3/logout.cpp
@@ -150,7 +150,7 @@ void sbbs_t::logout()
 	if(usrlibs>0)
 		putuserrec(&cfg,useron.number,U_CURDIR,0,cfg.dir[usrdir[curlib][curdir[curlib]]]->code);
 	hhmmtostr(&cfg,&tm,str);
-	strcat(str,"  ");
+	SAFECAT(str,"  ");
 	if(sys_status&SS_USERON)
 		safe_snprintf(tmp,sizeof(tmp),"T:%3u   R:%3lu   P:%3lu   E:%3lu   F:%3lu   "
 			"U:%3luk %lu   D:%3luk %lu"
@@ -159,8 +159,8 @@ void sbbs_t::logout()
 			,logon_dlb/1024UL,logon_dls);
 	else
 		SAFEPRINTF(tmp,"T:%3u sec",(uint)(now-answertime));
-	strcat(str,tmp);
-	strcat(str,"\r\n");
+	SAFECAT(str,tmp);
+	SAFECAT(str,"\r\n");
 	logline("@-",str);
 	sys_status&=~SS_USERON;
 	answertime=now; // Incase we're relogging on
diff --git a/src/sbbs3/mail.cpp b/src/sbbs3/mail.cpp
index 1e82aa860da7026110b7f724af07de857555f441..59f4f465070a220e54c385888ed3d9f6f853bd68 100644
--- a/src/sbbs3/mail.cpp
+++ b/src/sbbs3/mail.cpp
@@ -72,6 +72,7 @@ int sbbs_t::delmail(uint usernumber, int which)
 	}
 	smb_rewind(smb.sid_fp);
 	for(l=0;l<smb.status.total_msgs;) {
+		memset(&msg, 0, sizeof(msg));
 		if(smb_fread(&smb,&msg.idx,sizeof(idxrec_t),smb.sid_fp)!=sizeof(idxrec_t))
 			break;
 		if(!(msg.idx.attr&MSG_PERMANENT)
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index b5fefd5a289cbacf3bf979eeb5a4ea76bcf37fd2..bd826f15ff33becfaab9f2e8c8a7ab248382a240 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -2208,11 +2208,13 @@ static int chk_received_hdr(SOCKET socket,const char *buf,IN_ADDR *dnsbl_result,
 			ai.ai_flags = AI_NUMERICHOST|AI_NUMERICSERV|AI_PASSIVE;
 			if(getaddrinfo(p, NULL, &ai, &res)!=0)
 				break;
-			if(res->ai_family == AF_INET6)
+			if(res->ai_family == AF_INET6) {
 				memcpy(&addr, res->ai_addr, res->ai_addrlen);
-			else
+				freeaddrinfo(res);
+			} else {
+				freeaddrinfo(res);
 				break;
-			freeaddrinfo(res);
+			}
 		}
 		else {
 			strncpy(ip,p,16);
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 13579c8308f266f648afaa126574149572cfa2ca..472211f6bdf53f8c801af98848976b996769cc2e 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -726,8 +726,10 @@ js_log(JSContext *cx, uintN argc, jsval *arglist)
 	}
 
     for(; i<argc; i++) {
-		if((str=JS_ValueToString(cx, argv[i]))==NULL)
+		if((str=JS_ValueToString(cx, argv[i]))==NULL) {
+			FREE_AND_NULL(line);
 			return(JS_FALSE);
+		}
 		JSSTRING_TO_RASTRING(cx, str, line, &line_sz, NULL);
 		if(line==NULL)
 		    return(JS_FALSE);
@@ -740,7 +742,8 @@ js_log(JSContext *cx, uintN argc, jsval *arglist)
 			lprintf(level,"Node %d %s", sbbs->cfg.node_num, line);
 		JS_RESUMEREQUEST(cx, rc);
 	}
-	free(line);
+	if(line != NULL)
+		free(line);
 
 	if(str==NULL)
 		JS_SET_RVAL(cx, arglist, JSVAL_VOID);
@@ -844,6 +847,7 @@ js_write(JSContext *cx, uintN argc, jsval *arglist)
 			sbbs->bputs(cstr);
 		JS_RESUMEREQUEST(cx, rc);
 	}
+	FREE_AND_NULL(cstr);
 
 	if(str==NULL)
 		JS_SET_RVAL(cx, arglist, JSVAL_VOID);
@@ -876,6 +880,8 @@ js_write_raw(JSContext *cx, uintN argc, jsval *arglist)
 		sbbs->putcom(str, len);
 		JS_RESUMEREQUEST(cx, rc);
 	}
+	if (str != NULL)
+		free(str);
 
     return(JS_TRUE);
 }
diff --git a/src/sbbs3/netmail.cpp b/src/sbbs3/netmail.cpp
index c754c8166428f0d1e1cf359cbc374efb4e2ca2c3..f32b6022fcaade23f0fccfa3231705523b486392 100644
--- a/src/sbbs3/netmail.cpp
+++ b/src/sbbs3/netmail.cpp
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2015 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -118,7 +118,7 @@ bool sbbs_t::inetmail(const char *into, const char *subj, long mode)
 			for(x=0;x<cfg.total_prots;x++)
 				if(cfg.prot[x]->ulcmd[0] && chk_ar(cfg.prot[x]->ar,&useron,&client)) {
 					sprintf(tmp,"%c",cfg.prot[x]->mnemonic);
-					strcat(str,tmp); 
+					SAFECAT(str,tmp); 
 				}
 			ch=(char)getkeys(str,0);
 			if(ch==text[YNQP][2] || sys_status&SS_ABORT) {
diff --git a/src/sbbs3/prntfile.cpp b/src/sbbs3/prntfile.cpp
index 124ee5ec5c28ed8b1095a0c3a10d4a389e2e2fdb..9b7830f03cbf51e0fcd826bcb0724bb447a15923 100644
--- a/src/sbbs3/prntfile.cpp
+++ b/src/sbbs3/prntfile.cpp
@@ -90,12 +90,12 @@ void sbbs_t::printfile(char *str, long mode)
 
 	length=(long)filelength(file);
 	if(length<0) {
-		close(file);
+		fclose(stream);
 		errormsg(WHERE,ERR_CHK,str,length);
 		return;
 	}
 	if((buf=(char*)malloc(length+1L))==NULL) {
-		close(file);
+		fclose(stream);
 		errormsg(WHERE,ERR_ALLOC,str,length+1L);
 		return; 
 	}
diff --git a/src/sbbs3/qwktomsg.cpp b/src/sbbs3/qwktomsg.cpp
index 338a9119417b142192f8a1e5c9b59154fd9e418c..84fa6e80232fe9bdd0860c58d91cac044a6e2bf4 100644
--- a/src/sbbs3/qwktomsg.cpp
+++ b/src/sbbs3/qwktomsg.cpp
@@ -278,6 +278,7 @@ bool sbbs_t::qwk_import_msg(FILE *qwk_fp, char *hdrblk, ulong blocks
 	if(fread(qwkbuf,QWK_BLOCK_LEN,blocks-1,qwk_fp) != blocks-1) {
 		free(qwkbuf);
 		errormsg(WHERE,ERR_READ,"QWK msg blocks",(blocks-1)*QWK_BLOCK_LEN);
+		return false;
 	}
 
 	bodylen=0;
diff --git a/src/sbbs3/rechocfg.c b/src/sbbs3/rechocfg.c
index 53945bdf84f099c8b19faf6f7c8251b1f2b2e124..cc1c52f22b4f1c2029914b0d8a18e962cf57a4c8 100644
--- a/src/sbbs3/rechocfg.c
+++ b/src/sbbs3/rechocfg.c
@@ -307,8 +307,10 @@ bool sbbsecho_read_ini(sbbsecho_cfg_t* cfg)
 	/******************/
 	str_list_t archivelist = iniGetSectionList(ini, "archive:");
 	cfg->arcdefs = strListCount(archivelist);
-	if((cfg->arcdef = realloc(cfg->arcdef, sizeof(arcdef_t)*cfg->arcdefs)) == NULL)
+	if((cfg->arcdef = realloc(cfg->arcdef, sizeof(arcdef_t)*cfg->arcdefs)) == NULL) {
+		strListFree(&archivelist);
 		return false;
+	}
 	cfg->arcdefs = 0;
 	char* archive;
 	while((archive=strListRemove(&archivelist, 0)) != NULL) {
@@ -327,8 +329,10 @@ bool sbbsecho_read_ini(sbbsecho_cfg_t* cfg)
 	/****************/
 	str_list_t nodelist = iniGetSectionList(ini, "node:");
 	cfg->nodecfgs = strListCount(nodelist);
-	if((cfg->nodecfg = realloc(cfg->nodecfg, sizeof(nodecfg_t)*cfg->nodecfgs)) == NULL)
+	if((cfg->nodecfg = realloc(cfg->nodecfg, sizeof(nodecfg_t)*cfg->nodecfgs)) == NULL) {
+		strListFree(&nodelist);
 		return false;
+	}
 	cfg->nodecfgs = 0;
 	char* node;
 	while((node=strListRemove(&nodelist, 0)) != NULL) {
@@ -383,8 +387,10 @@ bool sbbsecho_read_ini(sbbsecho_cfg_t* cfg)
 	/**************/
 	str_list_t echolists = iniGetSectionList(ini, "echolist:");
 	cfg->listcfgs = strListCount(echolists);
-	if((cfg->listcfg = realloc(cfg->listcfg, sizeof(echolist_t)*cfg->listcfgs)) == NULL)
+	if((cfg->listcfg = realloc(cfg->listcfg, sizeof(echolist_t)*cfg->listcfgs)) == NULL) {
+		strListFree(&echolists);
 		return false;
+	}
 	cfg->listcfgs = 0;
 	char* echolist;
 	while((echolist=strListRemove(&echolists, 0)) != NULL) {
diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 6345e082020e61e93cfac007219b544a92694e7f..ea2f0e92ecd09efdd13c9a7ac3ff65270b576c5d 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -5941,7 +5941,8 @@ int main(int argc, char **argv)
 
 	cmdline[0]=0;
 	for(i=1;i<argc;i++) {
-		sprintf(cmdline+strlen(cmdline), "%s ", argv[i]);
+		SAFECAT(cmdline, argv[i]);
+		SAFECAT(cmdline, " ");
 		if(argv[i][0]=='-'
 #if !defined(__unix__)
 			|| argv[i][0]=='/'
diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c
index 7868a441dd4fa8244ef2bd9f3d0ddb31b602b0ba..ced7977f8f58092875cde74860006c93924aed65 100644
--- a/src/sbbs3/scfgsave.c
+++ b/src/sbbs3/scfgsave.c
@@ -660,6 +660,7 @@ BOOL DLLCALL write_file_cfg(scfg_t* cfg, int backup_level)
 	put_int(cfg->cdt_up_pct,stream);
 	put_int(cfg->cdt_dn_pct,stream);
 	put_int(l,stream);					/* unused */
+	memset(cmd, 0, sizeof(cmd));
 	put_str(cmd,stream);
 	put_int(cfg->leech_pct,stream);
 	put_int(cfg->leech_sec,stream);
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 763e2c65172c5b021090672255ff74b906b504ba..9cfec055f916d39b72fec07bfb9116ba7baa0b94 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -1577,6 +1577,7 @@ static service_t* read_services_ini(const char* services_ini, service_t* service
 			fclose(fp);
 			lprintf(LOG_CRIT,"!MALLOC FAILURE");
 			free(default_interfaces);
+			iniFreeStringList(sec_list);
 			return(service);
 		}
 		service=np;
diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp
index f37020131c352a62449d2cc6de15164d40b3968b..5dde5a9ac3409739319271d48be2d7b61c713fc2 100644
--- a/src/sbbs3/str.cpp
+++ b/src/sbbs3/str.cpp
@@ -159,6 +159,7 @@ void sbbs_t::sif(char *fname, char *answers, long len)
 	}
 	if(lread(file,buf,length)!=length) {
 		close(file);
+		free(buf);
 		errormsg(WHERE,ERR_READ,str,length);
 		answers[0]=0;
 		return; 
@@ -328,6 +329,7 @@ void sbbs_t::sof(char *fname, char *answers, long len)
 		close(file);
 		errormsg(WHERE,ERR_READ,str,length);
 		answers[0]=0;
+		free(buf);
 		return; 
 	}
 	close(file);
diff --git a/src/sbbs3/telgate.cpp b/src/sbbs3/telgate.cpp
index a7582b081e35ae2f9cfe1929c80c3699acde309a..4ce53c49521d9cf065baab049827a3f67f165544 100644
--- a/src/sbbs3/telgate.cpp
+++ b/src/sbbs3/telgate.cpp
@@ -150,7 +150,7 @@ void sbbs_t::telnet_gate(char* destaddr, ulong mode, char* client_user_name, cha
 	while(online) {
 		if(!(mode&TG_NOCHKTIME))
 			gettimeleft();
-		rd=RingBufRead(&inbuf,buf,sizeof(buf));
+		rd=RingBufRead(&inbuf,buf,sizeof(buf)-1);
 		if(rd) {
 #if 0
 			if(memchr(buf,TELNET_IAC,rd)) {
diff --git a/src/sbbs3/tmp_xfer.cpp b/src/sbbs3/tmp_xfer.cpp
index 6da3d30f695bbd2d43afb7e81159e0ead21e3fc0..71a1ba1dd1242f0f301ca29c3dbca8f3dde569d6 100644
--- a/src/sbbs3/tmp_xfer.cpp
+++ b/src/sbbs3/tmp_xfer.cpp
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -171,7 +171,7 @@ void sbbs_t::temp_xfer()
 				for(i=0;i<cfg.total_prots;i++)
 					if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron,&client)) {
 						sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
-						strcat(tmp2,tmp); 
+						SAFECAT(tmp2,tmp); 
 					}
 				ungetkey(useron.prot);
 				ch=(char)getkeys(tmp2,0);
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 6ec1565f2fc93ac2a3a7afa6ba34fce66724b5ec..2e9a39f6f812235dbf38212e206db3c4e1cd70b9 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -2039,8 +2039,13 @@ int DLLCALL putuserrec(scfg_t* cfg, int usernumber,int start, uint length, const
 		return(-4);
 	}
 
-	if(length==0)	/* auto-length */
+	if(length==0) {	/* auto-length */
 		length=user_rec_len(start);
+		if((long)length < 0) {
+			close(file);
+			return -2;
+		}
+	}
 
 	strcpy(str2,str);
 	if(strlen(str2)<length) {
@@ -2058,8 +2063,10 @@ int DLLCALL putuserrec(scfg_t* cfg, int usernumber,int start, uint length, const
 		i++; 
 	}
 
-	if(i>=LOOP_NODEDAB) 
+	if(i>=LOOP_NODEDAB) {
+		close(file);
 		return(-3);
+	}
 
 	write(file,str2,length);
 	unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length);
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index 70f27ef5a7922e0c58491953bfc9d8ad04445e0a..ba9a95c1b1d7947207eb3e1f81935413515dcf10 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -1407,6 +1407,7 @@ static int sock_sendfile(http_session_t *session,char *path,unsigned long start,
 		if(start || end) {
 			if(lseek(file, start, SEEK_SET)==-1) {
 				lprintf(LOG_WARNING,"%04d !ERROR %d seeking to position %lu in %s",session->socket,ERROR_VALUE,start,path);
+				close(file);
 				return(0);
 			}
 			remain=end-start+1;
@@ -1417,6 +1418,7 @@ static int sock_sendfile(http_session_t *session,char *path,unsigned long start,
 		while((i=read(file, buf, remain>sizeof(buf)?sizeof(buf):remain))>0) {
 			if(writebuf(session,buf,i)!=i) {
 				lprintf(LOG_WARNING,"%04d !ERROR sending %s",session->socket,path);
+				close(file);
 				return(0);
 			}
 			ret+=i;
@@ -2328,6 +2330,7 @@ static void js_add_header(http_session_t * session, char *key, char *value)
 		return;
 	strlwr(lckey);
 	if((js_str=JS_NewStringCopyZ(session->js_cx, value))==NULL) {
+		free(lckey);
 		return;
 	}
 	JS_DefineProperty(session->js_cx, session->js_header, lckey, STRING_TO_JSVAL(js_str)
@@ -3710,6 +3713,7 @@ static SOCKET fastcgi_connect(const char *orig_path, SOCKET client_sock)
 	// TODO: UNIX-domain sockets...
 	if (strncmp(path, "unix:", 5) == 0) {
 		lprintf(LOG_ERR, "%04d UNIX-domain FastCGI sockets not supported (yet)", client_sock);
+		free(path);
 		return INVALID_SOCKET;
 	}
 
@@ -3720,6 +3724,7 @@ static SOCKET fastcgi_connect(const char *orig_path, SOCKET client_sock)
 	result = getaddrinfo(path, port, &hints, &res);
 	if(result != 0) {
 		lprintf(LOG_ERR, "%04d ERROR resolving FastCGI address %s port %s", client_sock, path, port);
+		free(path);
 		return INVALID_SOCKET;
 	}
 	for(cur=res,result=1; result && cur; cur=cur->ai_next) {
@@ -3750,11 +3755,13 @@ static SOCKET fastcgi_connect(const char *orig_path, SOCKET client_sock)
 	freeaddrinfo(res);
 	if(sock == INVALID_SOCKET) {
 		lprintf(LOG_ERR, "%04d ERROR unable to make FastCGI connection to %s", client_sock, orig_path);
+		free(path);
 		return sock;
 	}
 
 	val = 0;
 	ioctlsocket(sock,FIONBIO,&val);
+	free(path);
 	return sock;
 }
 
@@ -3841,6 +3848,7 @@ static BOOL fastcgi_send_params(SOCKET sock, http_session_t *session)
 	for(i=0; env[i]; i++) {
 		if (!fastcgi_add_param(&msg, &end, &size, env[i])) {
 			free(msg);
+			strListFree(&env);
 			return FALSE;
 		}
 		if (end > 32000) {
@@ -3848,11 +3856,13 @@ static BOOL fastcgi_send_params(SOCKET sock, http_session_t *session)
 			if (sendsocket(sock, (void *)msg, sizeof(struct fastcgi_header) + end) != (sizeof(struct fastcgi_header) + end)) {
 				lprintf(LOG_ERR, "%04d ERROR sending FastCGI params", session->socket);
 				free(msg);
+				strListFree(&env);
 				return FALSE;
 			}
 			end = 0;
 		}
 	}
+	strListFree(&env);
 	if (end) {
 		msg->head.len = htons(end);
 		if (sendsocket(sock, (void *)msg, sizeof(struct fastcgi_header) + end) != (sizeof(struct fastcgi_header) + end)) {
@@ -5152,7 +5162,7 @@ js_set_cookie(JSContext *cx, uintN argc, jsval *arglist)
 	if(!p)
 		return(JS_FALSE);
 	header+=sprintf(header,"%s",p);
-	free(p);
+	FREE_AND_NULL(p);
 	if(argc>2) {
 		if(!JS_ValueToInt32(cx,argv[2],&i))
 			return JS_FALSE;
@@ -5164,15 +5174,15 @@ js_set_cookie(JSContext *cx, uintN argc, jsval *arglist)
 		JSVALUE_TO_MSTRING(cx, argv[3], p, NULL);
 		if(p!=NULL && *p) {
 			header += sprintf(header,"; domain=%s",p);
-			free(p);
 		}
+		FREE_AND_NULL(p);
 	}
 	if(argc>4) {
 		JSVALUE_TO_MSTRING(cx, argv[4], p, NULL);
 		if(p!=NULL && *p) {
 			header += sprintf(header,"; path=%s",p);
-			free(p);
 		}
+		FREE_AND_NULL(p);
 	}
 	if(argc>5) {
 		JS_ValueToBoolean(cx, argv[5], &b);
diff --git a/src/sbbs3/writemsg.cpp b/src/sbbs3/writemsg.cpp
index c757b7e22b6d47cfb08b2e94bf7292a0f627abed..90bbce1f3197bd89634143b0e3f6c413f79d6517 100644
--- a/src/sbbs3/writemsg.cpp
+++ b/src/sbbs3/writemsg.cpp
@@ -174,8 +174,10 @@ int sbbs_t::process_edited_file(const char* src, const char* dest, long mode, un
 	if((buf=(char*)malloc(len+1))==NULL)
 		return -2;
 
-	if((fp=fopen(src,"rb"))==NULL)
+	if((fp=fopen(src,"rb"))==NULL) {
+		free(buf);
 		return -3;
+	}
 
 	memset(buf,0,len+1);
 	fread(buf,len,sizeof(char),fp);
@@ -220,10 +222,10 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, long mode,
 	if(editor!=NULL)
 		*editor=NULL;
 
-	if((buf=(char*)malloc(cfg.level_linespermsg[useron_level]*MAX_LINE_LEN))
+	if((buf=(char*)malloc((cfg.level_linespermsg[useron_level]*MAX_LINE_LEN) + 1))
 		==NULL) {
 		errormsg(WHERE,ERR_ALLOC,fname
-			,cfg.level_linespermsg[useron_level]*MAX_LINE_LEN);
+			,(cfg.level_linespermsg[useron_level]*MAX_LINE_LEN) +1);
 		return(false); 
 	}
 
diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index 18b0f40bff5b69d6c3e14a5621d8f2bbf4bd6abb..efb7d80d6a9a6176bbf0a67d03bd753e57f39aef 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -2065,7 +2065,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
     else
         cmd=outstr;
     len=strlen(instr);
-    for(i=j=0;i<len && j<(int)sizeof(cmdstr_output);i++) {
+    for(i=j=0; i<len && j < (int)sizeof(cmdstr_output)-1; i++) {
         if(instr[i]=='%') {
             i++;
             cmd[j]=0;
@@ -2229,7 +2229,7 @@ char* DLLCALL cmdstr(scfg_t* cfg, user_t* user, const char* instr, const char* f
 
 	if(cmd==NULL)	cmd=buf;
     len=strlen(instr);
-    for(i=j=0;i<len && j<MAX_PATH;i++) {
+    for(i=j=0; i<len && j < sizeof(buf)-1; i++) {
         if(instr[i]=='%') {
             i++;
             cmd[j]=0;
diff --git a/src/sbbs3/xtrn_sec.cpp b/src/sbbs3/xtrn_sec.cpp
index a4a91a666dff94cce0b18cd1c2546b35353ac4a7..726201dda5a9ca565ff85d33b497c32b060dc7fa 100644
--- a/src/sbbs3/xtrn_sec.cpp
+++ b/src/sbbs3/xtrn_sec.cpp
@@ -275,7 +275,7 @@ static void lfexpand(char *str, ulong misc)
 	if(misc&XTRN_NATIVE)
 		return;
 
-	for(p=str;*p && len < sizeof(newstr)-1;p++) {
+	for(p=str;*p && len < sizeof(newstr)-2;p++) {
 		if(*p=='\n')
 			newstr[len++]='\r';
 		newstr[len++]=*p;
@@ -403,7 +403,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl
 				strcpy(str,cfg.xtrn[i]->name);
 			else
 				str[0]=0;						/* Blank if no access */
-			strcat(str,"\n");
+			SAFECAT(str,"\n");
 			lfexpand(str,misc);
 			write(file,str,strlen(str)); 
 		}
@@ -794,6 +794,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl
 		write(file,&logontime,sizeof(logontime));	/* LoginSec */
 		write(file,&useron.cdt,sizeof(useron.cdt));	/* Credit */
 		write(file,&useron.number,sizeof(useron.number)); /* UserRecNum */
+		i=0;
 		write(file,&i,2);						/* ReadThru */
 		write(file,&i,2);						/* PageTimes */
 		write(file,&i,2);						/* DownLimit */
@@ -1076,9 +1077,14 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl
 		write(file,name,26);			/* Name */
 		sprintf(str,"%.24s",useron.location);
 		write(file,str,25); 			/* Location */
-		write(file,useron.pass,13); 	/* Password */
-		write(file,useron.phone,14);	/* Business or Data Phone */
-		write(file,useron.phone,14);	/* Home or Voice Phone */
+		write(file,useron.pass, 9); 	/* Password */
+		l=0;
+		write(file, &l, 4);	/* more password bytes */
+		c=0;
+		write(file,useron.phone, 13);	/* Business or Data Phone */
+		write(file, &c, 1);	/* more phone number bytes */
+		write(file,useron.phone, 13);	/* Home or Voice Phone */
+		write(file, &c, 1);	/* more phone number bytes */
 		i=unixtojulian(useron.laston);
 		write(file,&i,2);				/* Date last on */
 		localtime32(&useron.laston,&tm);
@@ -1467,8 +1473,8 @@ void sbbs_t::moduserdat(uint xtrnnum)
 			ultoac(mod>0L ? mod : -mod,tmp);		/* put commas in the # */
 			strcpy(str,"Credit Adjustment: ");
 			if(mod<0L)
-				strcat(str,"-");                    /* negative, put '-' */
-			strcat(str,tmp);
+				SAFECAT(str,"-");                    /* negative, put '-' */
+			SAFECAT(str,tmp);
 			if(mod>0L)
 				strcpy(tmp,"$+");
 			else
@@ -1670,7 +1676,7 @@ bool sbbs_t::exec_xtrn(uint xtrnnum)
 	}
 	if(cfg.xtrn[xtrnnum]->misc&XTRN_LWRCASE)
 		strlwr(name);
-	strcat(path,name);
+	SAFECAT(path,name);
 	if(action!=NODE_PCHT) {
 		getnodedat(cfg.node_num,&thisnode,1);
 		thisnode.action=NODE_XTRN;
diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c
index e2626e44089a2a1a8c6a0fedd3b789998d2156ee..34a9fffd445cdb990b541efd0ae2b40bcb218b2e 100644
--- a/src/sbbs3/zmodem.c
+++ b/src/sbbs3/zmodem.c
@@ -2014,6 +2014,7 @@ int zmodem_recv_files(zmodem_t* zm, const char* download_dir, uint64_t* bytes_re
 			}
 			start_bytes=filelength(fileno(fp));
 			if(start_bytes < 0) {
+				fclose(fp);
 				lprintf(zm,LOG_ERR,"Invalid file length %"PRId64": %s", start_bytes, fpath);
 				break;
 			}