From 24831379d3571f77e691d805e089e7dc2bce65c0 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 20 Feb 2018 05:35:52 +0000
Subject: [PATCH] Address many (but not all) Coverity reported "issues".

---
 src/sbbs3/sbbsecho.c | 373 ++++++++++++++++++++++++-------------------
 1 file changed, 208 insertions(+), 165 deletions(-)

diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 95e44fa727..6345e08202 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -302,20 +302,20 @@ echostat_msg_t parse_echostat_msg(str_list_t ini, const char* section, const cha
 	return msg;
 }
 
-echostat_msg_t fidomsg_to_echostat_msg(fmsghdr_t fmsghdr, fidoaddr_t* pkt_orig, const char* fmsgbuf)
+echostat_msg_t fidomsg_to_echostat_msg(fmsghdr_t* hdr, fidoaddr_t* pkt_orig, const char* fmsgbuf)
 {
 	char* p;
 	echostat_msg_t msg = {{0}};
 
-	SAFECOPY(msg.to		, fmsghdr.to);
-	SAFECOPY(msg.from	, fmsghdr.from);
-	SAFECOPY(msg.subj	, fmsghdr.subj);
-	msg.msg_time		= fmsgtime(fmsghdr.time);
+	SAFECOPY(msg.to		, hdr->to);
+	SAFECOPY(msg.from	, hdr->from);
+	SAFECOPY(msg.subj	, hdr->subj);
+	msg.msg_time		= fmsgtime(hdr->time);
 	msg.localtime		= time(NULL);
-	msg.origaddr.zone	= fmsghdr.origzone;
-	msg.origaddr.net	= fmsghdr.orignet;
-	msg.origaddr.node	= fmsghdr.orignode;
-	msg.origaddr.point	= fmsghdr.origpoint;
+	msg.origaddr.zone	= hdr->origzone;
+	msg.origaddr.net	= hdr->orignet;
+	msg.origaddr.node	= hdr->orignode;
+	msg.origaddr.point	= hdr->origpoint;
 	if(pkt_orig != NULL)
 		msg.pkt_orig	= *pkt_orig;
 	if((p = parse_control_line(fmsgbuf, "MSGID:")) != NULL) {
@@ -575,89 +575,89 @@ char *mycmdstr(scfg_t* cfg, const char *instr, const char *fpath, const char *fs
 			cmd[j]=0;
 			switch(toupper(instr[i])) {
 				case 'F':   /* File path */
-					strcat(cmd,fpath);
+					SAFECAT(cmd,fpath);
 					break;
 				case 'G':   /* Temp directory */
 					if(cfg->temp_dir[0]!='\\' 
 						&& cfg->temp_dir[0]!='/' 
 						&& cfg->temp_dir[1]!=':') {
-						strcpy(str,cfg->node_dir);
-						strcat(str,cfg->temp_dir);
+						SAFECOPY(str,cfg->node_dir);
+						SAFECAT(str,cfg->temp_dir);
 						if(FULLPATH(str2,str,40))
 							strcpy(str,str2);
 						backslash(str);
-						strcat(cmd,str);}
+						SAFECAT(cmd,str);}
 					else
-						strcat(cmd,cfg->temp_dir);
+						SAFECAT(cmd,cfg->temp_dir);
 					break;
 				case 'J':
 					if(cfg->data_dir[0]!='\\' 
 						&& cfg->data_dir[0]!='/' 
 						&& cfg->data_dir[1]!=':') {
-						strcpy(str,cfg->node_dir);
-						strcat(str,cfg->data_dir);
+						SAFECOPY(str,cfg->node_dir);
+						SAFECAT(str,cfg->data_dir);
 						if(FULLPATH(str2,str,40))
-							strcpy(str,str2);
+							SAFECOPY(str,str2);
 						backslash(str);
-						strcat(cmd,str); 
+						SAFECAT(cmd,str); 
 					}
 					else
-						strcat(cmd,cfg->data_dir);
+						SAFECAT(cmd,cfg->data_dir);
 					break;
 				case 'K':
 					if(cfg->ctrl_dir[0]!='\\' 
 						&& cfg->ctrl_dir[0]!='/' 
 						&& cfg->ctrl_dir[1]!=':') {
-						strcpy(str,cfg->node_dir);
-						strcat(str,cfg->ctrl_dir);
+						SAFECOPY(str,cfg->node_dir);
+						SAFECAT(str,cfg->ctrl_dir);
 						if(FULLPATH(str2,str,40))
-							strcpy(str,str2);
+							SAFECOPY(str,str2);
 						backslash(str);
-						strcat(cmd,str); 
+						SAFECAT(cmd,str); 
 					}
 					else
-						strcat(cmd,cfg->ctrl_dir);
+						SAFECAT(cmd,cfg->ctrl_dir);
 					break;
 				case 'N':   /* Node Directory (same as SBBSNODE environment var) */
-					strcat(cmd,cfg->node_dir);
+					SAFECAT(cmd,cfg->node_dir);
 					break;
 				case 'O':   /* SysOp */
-					strcat(cmd,cfg->sys_op);
+					SAFECAT(cmd,cfg->sys_op);
 					break;
 				case 'Q':   /* QWK ID */
-					strcat(cmd,cfg->sys_id);
+					SAFECAT(cmd,cfg->sys_id);
 					break;
 				case 'S':   /* File Spec */
-					strcat(cmd,fspec);
+					SAFECAT(cmd,fspec);
 					break;
 				case '!':   /* EXEC Directory */
-					strcat(cmd,cfg->exec_dir);
+					SAFECAT(cmd,cfg->exec_dir);
 					break;
                 case '@':   /* EXEC Directory for DOS/OS2/Win32, blank for Unix */
 #ifndef __unix__
-                    strcat(cmd,cfg->exec_dir);
+                    SAFECAT(cmd,cfg->exec_dir);
 #endif
                     break;
 				case '#':   /* Node number (same as SBBSNNUM environment var) */
 					sprintf(str,"%d",cfg->node_num);
-					strcat(cmd,str);
+					SAFECAT(cmd,str);
 					break;
 				case '*':
 					sprintf(str,"%03d",cfg->node_num);
-					strcat(cmd,str);
+					SAFECAT(cmd,str);
 					break;
 				case '%':   /* %% for percent sign */
-					strcat(cmd,"%");
+					SAFECAT(cmd,"%");
 					break;
 				case '.':	/* .exe for DOS/OS2/Win32, blank for Unix */
 #ifndef __unix__
-					strcat(cmd,".exe");
+					SAFECAT(cmd,".exe");
 #endif
 					break;
 				case '?':	/* Platform */
-					strcpy(str,PLATFORM_DESC);
+					SAFECOPY(str,PLATFORM_DESC);
 					strlwr(str);
-					strcat(cmd,str);
+					SAFECAT(cmd,str);
 					break;
 				default:    /* unknown specification */
 					lprintf(LOG_ERR,"ERROR Checking Command Line '%s'",instr);
@@ -733,7 +733,10 @@ int get_outbound(fidoaddr_t dest, char* outbound, size_t maxlen, bool fileboxes)
 const char* get_current_outbound(fidoaddr_t dest, bool fileboxes)
 {
 	static char outbound[MAX_PATH+1];
-	get_outbound(dest, outbound, sizeof(outbound)-1, fileboxes);
+	if(get_outbound(dest, outbound, sizeof(outbound)-1, fileboxes) != 0) {
+		lprintf(LOG_ERR, "Error creating outbound directory");
+		return NULL;
+	}
 	return outbound;
 }
 
@@ -746,6 +749,8 @@ bool bso_lock_node(fidoaddr_t dest)
 		return true;
 
 	outbound = get_current_outbound(dest, /* fileboxes: */false);
+	if(outbound == NULL)
+		return false;
 
 	if(dest.point)
 		SAFEPRINTF2(fname,"%s%08x.bsy",outbound,dest.point);
@@ -793,6 +798,8 @@ const char* bso_flo_filename(fidoaddr_t dest, uint16_t attr)
 		}
 	}
 	outbound = get_current_outbound(dest, /* fileboxes: */false);
+	if(outbound == NULL)
+		return NULL;
 
 	if(dest.point)
 		SAFEPRINTF3(filename,"%s%08x.%clo",outbound,dest.point,ch);
@@ -823,6 +830,9 @@ int write_flofile(const char *infile, fidoaddr_t dest, bool bundle, bool use_out
 		return 1;
 
 	flo_filename = bso_flo_filename(dest, attr);
+	if(flo_filename == NULL)
+		return -2;
+
 	SAFECOPY(attachment, infile);
 	if(!fexistcase(attachment))	{ /* just in-case it's the wrong case for a Unix file system */
 		lprintf(LOG_ERR, "ERROR line %u, attachment file not found: %s", __LINE__, attachment);
@@ -1101,7 +1111,10 @@ int create_netmail(const char *to, const smbmsg_t* msg, const char *subject, con
 			nodecfg=findnodecfg(&cfg, dest, /* skip exact match: */2);
 	}
 
-	MKDIR(scfg.netmail_dir);
+	if(!isdir(scfg.netmail_dir) && MKDIR(scfg.netmail_dir) != 0) {
+		lprintf(LOG_ERR, "Error %u (%s) line %d creating directory: %s", errno, strerror(errno), __LINE__, scfg.netmail_dir);
+		return -2;
+	}
 	for(i=startmsg;i;i++) {
 		sprintf(fname,"%s%u.msg",scfg.netmail_dir,i);
 		if(!fexistcase(fname))
@@ -1151,7 +1164,7 @@ int create_netmail(const char *to, const smbmsg_t* msg, const char *subject, con
 	SAFECOPY(hdr.from,from);
 	SAFECOPY(hdr.subj,subject);
 
-	fwrite(&hdr,sizeof(fmsghdr_t),1,fp);
+	(void)fwrite(&hdr,sizeof(fmsghdr_t),1,fp);
 	fwrite_intl_control_line(fp, &hdr);
 
 	if(!fidoctrl_line_exists(msg, "TZUTC:")) {
@@ -1221,7 +1234,9 @@ int file_to_netmail(FILE* infile, const char* title, fidoaddr_t dest, const char
 	long l,m,len;
 	int netmails_created = 0;
 
-	fseek(infile, 0, SEEK_END);
+	if(fseek(infile, 0, SEEK_END) != 0)
+		return 0;
+
 	l=len=ftell(infile);
 	if(len>8192L)
 		len=8192L;
@@ -1237,10 +1252,10 @@ int file_to_netmail(FILE* infile, const char* title, fidoaddr_t dest, const char
 			if(*p) {
 				*p=0;
 				p++;
-				fseek(infile,-1L,SEEK_CUR);
+				(void)fseek(infile,-1L,SEEK_CUR);
 				while(*p) { 			/* Seek back to end of last line */
 					p++;
-					fseek(infile,-1L,SEEK_CUR); 
+					(void)fseek(infile,-1L,SEEK_CUR); 
 				} 
 			} 
 		}
@@ -1401,11 +1416,11 @@ void netmail_arealist(enum arealist_type type, fidoaddr_t addr, const char* to)
 	str_list_t	area_list;
 
 	if(type == AREALIST_ALL)
-		strcpy(title,"List of Available Areas");
+		SAFECOPY(title,"List of Available Areas");
 	else if(type == AREALIST_CONNECTED)
-		strcpy(title,"List of Connected Areas");
+		SAFECOPY(title,"List of Connected Areas");
 	else
-		strcpy(title,"List of Unlinked Areas");
+		SAFECOPY(title,"List of Unlinked Areas");
 
 	if((area_list=strListInit()) == NULL) {
 		lprintf(LOG_ERR,"ERROR line %d couldn't allocate string list",__LINE__);
@@ -2287,7 +2302,8 @@ int unpack(const char *infile, const char* outdir)
 	}
 	for(u=0;u<cfg.arcdefs;u++) {
 		str[0]=0;
-		fseek(stream,cfg.arcdef[u].byteloc,SEEK_SET);
+		if(fseek(stream,cfg.arcdef[u].byteloc,SEEK_SET) != 0)
+			continue;
 		for(j=0;j<strlen(cfg.arcdef[u].hexid)/2;j++) {
 			ch=fgetc(stream);
 			if(ch==EOF) {
@@ -2434,7 +2450,7 @@ int attachment(const char *bundlename, fidoaddr_t dest, enum attachment_mode mod
 		globfree(&g);
 
 		while(!feof(stream)) {
-			if(!fread(&attach,sizeof(attach_t),1,stream))
+			if(fread(&attach,1,sizeof(attach_t),stream) != sizeof(attach_t))
 				break;
 			TERMINATE(attach.filename);
 			if(!fexistcase(attach.filename))
@@ -2472,7 +2488,7 @@ int attachment(const char *bundlename, fidoaddr_t dest, enum attachment_mode mod
 	memcpy(&attach.dest,&dest,sizeof(fidoaddr_t));
 	SAFECOPY(attach.filename,bundlename);
 	/* TODO: Write of unpacked struct */
-	fwrite(&attach,sizeof(attach_t),1,stream);
+	(void)fwrite(&attach,sizeof(attach_t),1,stream);
 	fclose(stream);
 #endif
 	return(0);
@@ -2528,6 +2544,8 @@ bool pack_bundle(const char *tmp_pkt, fidoaddr_t orig, fidoaddr_t dest)
 		}
 	}
 	outbound = get_current_outbound(dest, /* fileboxes: */true);
+	if(outbound == NULL)
+		return false;
 
 	/* Try to use the same filename as the temp packet, if we can */
 	SAFEPRINTF2(new_pkt, "%s%s", outbound, getfname(tmp_pkt));
@@ -2761,18 +2779,22 @@ int mv(const char *insrc, const char *indest, bool copy)
 	setvbuf(outp,NULL,_IOFBF,8*1024);
 	length=filelength(ind);
 	l=0L;
+	int result = 0;
 	while(l<length) {
 		if(l+chunk>length)
 			chunk=length-l;
-		fread(buf,chunk,1,inp);
-		fwrite(buf,chunk,1,outp);
-		l+=chunk; 
+		if(fread(buf,1,chunk,inp) != chunk) {
+			result = -2;
+			break;
+		}
+		(void)fwrite(buf,chunk,1,outp);
+		l+=chunk;
 	}
 	fclose(inp);
 	fclose(outp);
-	if(!copy)
+	if(result == 0 && !copy)
 		delfile(src, __LINE__);
-	return(0);
+	return result;
 }
 
 /****************************************************************************/
@@ -2835,7 +2857,11 @@ ulong loadmsgs(smb_t* smb, post_t** post, ulong ptr)
 		return(0); 
 	}
 
-	fseek(smb->sid_fp,0L,SEEK_SET);
+	if(fseek(smb->sid_fp,0L,SEEK_SET) != 0) {
+		lprintf(LOG_ERR, "ERROR %u (%s) line %d rewinding index of %s"
+			,errno, strerror(errno), __LINE__, smb->file);
+		return 0;
+	}
 	for(l=0;l<total && !feof(smb->sid_fp); ) {
 		if(smb_fread(smb, &idx,sizeof(idx),smb->sid_fp) != sizeof(idx))
 			break;
@@ -3018,11 +3044,11 @@ ushort matchname(const char *inname)
 				lprintf(LOG_ERR,"ERROR locking USER.DAT record #%ld",total_users);
 				continue; 
 			}
-			lseek(userdat,(long)((long)(total_users)*U_LEN)+U_ALIAS,SEEK_SET);
-			read(userdat,alias,LEN_ALIAS);
-			read(userdat,name,LEN_NAME);
-			lseek(userdat,(long)(((long)total_users)*U_LEN)+U_MISC,SEEK_SET);
-			read(userdat,misc,8);
+			(void)lseek(userdat,(long)((long)(total_users)*U_LEN)+U_ALIAS,SEEK_SET);
+			(void)read(userdat,alias,LEN_ALIAS);
+			(void)read(userdat,name,LEN_NAME);
+			(void)lseek(userdat,(long)(((long)total_users)*U_LEN)+U_MISC,SEEK_SET);
+			(void)read(userdat,misc,8);
 			for(i=0;i<8;i++)
 				if(misc[i]==ETX || misc[i]=='\r') break;
 			misc[i]=0;
@@ -3183,7 +3209,8 @@ char* getfmsg(FILE* stream, ulong* outlen)
 {
 	uchar* fbuf;
 	int ch;
-	ulong l,length,start;
+	long start;
+	ulong l,length;
 
 	length=0L;
 	start=ftell(stream);						/* Beginning of Message */
@@ -3200,11 +3227,11 @@ char* getfmsg(FILE* stream, ulong* outlen)
 		return(NULL);
 	}
 
-	fseek(stream,start,SEEK_SET);
+	(void)fseek(stream,start,SEEK_SET);
 	for(l=0;l<length;l++)
-		fbuf[l]=fgetc(stream);
+		fbuf[l]=(uchar)fgetc(stream);
 	if(ch==0)
-		fgetc(stream);		/* Read NULL */
+		(void)fgetc(stream);		/* Read NULL */
 
 	while(length && fbuf[length-1]<=' ')	/* truncate white-space */
 		length--;
@@ -3231,7 +3258,7 @@ enum {
 /* Returns 0 on success, 1 dupe, 2 filtered, 3 empty, 4 too-old				*/
 /* or other SMB error														*/
 /****************************************************************************/
-int fmsgtosmsg(char* fbuf, fmsghdr_t fmsghdr, uint user, uint subnum)
+int fmsgtosmsg(char* fbuf, fmsghdr_t* hdr, uint user, uint subnum)
 {
 	uchar	ch,stail[MAX_TAILLEN+1],*sbody;
 	char	msg_id[256],str[128],*p;
@@ -3251,53 +3278,53 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t fmsghdr, uint user, uint subnum)
 
 	if(twit_list) {
 		sprintf(fname,"%stwitlist.cfg",scfg.ctrl_dir);
-		if(findstr(fmsghdr.from,fname) || findstr(fmsghdr.to,fname)) {
-			lprintf(LOG_INFO,"Filtering message from %s to %s",fmsghdr.from,fmsghdr.to);
+		if(findstr(hdr->from,fname) || findstr(hdr->to,fname)) {
+			lprintf(LOG_INFO,"Filtering message from %s to %s",hdr->from,hdr->to);
 			return IMPORT_FILTERED_TWIT;
 		}
 	}
 
 	memset(&msg,0,sizeof(smbmsg_t));
-	if(fmsghdr.attr&FIDO_PRIVATE)
+	if(hdr->attr&FIDO_PRIVATE)
 		msg.hdr.attr|=MSG_PRIVATE;
 	if(scfg.sys_misc&SM_DELREADM)
 		msg.hdr.attr|=MSG_KILLREAD;
-	if(fmsghdr.attr&FIDO_FILE)
+	if(hdr->attr&FIDO_FILE)
 		msg.hdr.auxattr|=MSG_FILEATTACH;
 
 	msg.hdr.when_imported.time=now;
 	msg.hdr.when_imported.zone=sys_timezone(&scfg);
-	if(fmsghdr.time[0]) {
-		msg.hdr.when_written.time=fmsgtime(fmsghdr.time);
+	if(hdr->time[0]) {
+		msg.hdr.when_written.time=fmsgtime(hdr->time);
 		if(max_msg_age && (time32_t)msg.hdr.when_written.time < now
 			&& (now - msg.hdr.when_written.time) > max_msg_age) {
 			lprintf(LOG_INFO, "Filtering message from %s due to age: %1.1f days"
-				,fmsghdr.from
+				,hdr->from
 				,(now - msg.hdr.when_written.time) / (24.0*60.0*60.0));
 			return IMPORT_FILTERED_AGE;
 		}
 	} else
 		msg.hdr.when_written = msg.hdr.when_imported;
 
-	origaddr.zone=fmsghdr.origzone; 	/* only valid if NetMail */
-	origaddr.net=fmsghdr.orignet;
-	origaddr.node=fmsghdr.orignode;
-	origaddr.point=fmsghdr.origpoint;
+	origaddr.zone=hdr->origzone; 	/* only valid if NetMail */
+	origaddr.net=hdr->orignet;
+	origaddr.node=hdr->orignode;
+	origaddr.point=hdr->origpoint;
 
-	destaddr.zone=fmsghdr.destzone; 	/* only valid if NetMail */
-	destaddr.net=fmsghdr.destnet;
-	destaddr.node=fmsghdr.destnode;
-	destaddr.point=fmsghdr.destpoint;
+	destaddr.zone=hdr->destzone; 	/* only valid if NetMail */
+	destaddr.net=hdr->destnet;
+	destaddr.node=hdr->destnode;
+	destaddr.point=hdr->destpoint;
 
-	smb_hfield_str(&msg,SENDER,fmsghdr.from);
-	smb_hfield_str(&msg,RECIPIENT,fmsghdr.to);
+	smb_hfield_str(&msg,SENDER,hdr->from);
+	smb_hfield_str(&msg,RECIPIENT,hdr->to);
 
 	if(user) {
 		sprintf(str,"%u",user);
 		smb_hfield_str(&msg,RECIPIENTEXT,str);
 	}
 
-	smb_hfield_str(&msg,SUBJECT,fmsghdr.subj);
+	smb_hfield_str(&msg,SUBJECT,hdr->subj);
 
 	if(fbuf==NULL) {
 		lprintf(LOG_ERR,"ERROR line %d allocating fbuf",__LINE__);
@@ -3562,6 +3589,7 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t fmsghdr, uint user, uint subnum)
 	}
 	smb_freemsgmem(&msg);
 
+	free(sbody);
 	return(i);
 }
 
@@ -3606,7 +3634,7 @@ void getzpt(FILE* stream, fmsghdr_t* hdr)
 		else
 			cr=0; 
 	}
-	fseek(stream,pos,SEEK_SET);
+	(void)fseek(stream,pos,SEEK_SET);
 }
 
 bool foreign_zone(uint16_t zone1, uint16_t zone2)
@@ -3620,7 +3648,7 @@ bool foreign_zone(uint16_t zone1, uint16_t zone2)
  This function puts a message into a Fido packet, writing both the header
  information and the message body
 ******************************************************************************/
-void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
+void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t* hdr, area_t area
 	,addrlist_t seenbys, addrlist_t paths)
 {
 	char str[256],seenby[256];
@@ -3630,27 +3658,27 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 	fpkdmsg_t pkdmsg;
 	size_t len;
 
-	addr=getsysfaddr(fmsghdr.destzone);
+	addr=getsysfaddr(hdr->destzone);
 
 	/* Write fixed-length header fields */
 	memset(&pkdmsg,0,sizeof(pkdmsg));
 	pkdmsg.type		= 2;
 	pkdmsg.orignet	= addr.net;
 	pkdmsg.orignode	= addr.node;
-	pkdmsg.destnet	= fmsghdr.destnet;
-	pkdmsg.destnode	= fmsghdr.destnode;
-	pkdmsg.attr		= fmsghdr.attr;
-	pkdmsg.cost		= fmsghdr.cost;
-	SAFECOPY(pkdmsg.time,fmsghdr.time);
-	fwrite(&pkdmsg		,sizeof(pkdmsg)			,1,stream);
+	pkdmsg.destnet	= hdr->destnet;
+	pkdmsg.destnode	= hdr->destnode;
+	pkdmsg.attr		= hdr->attr;
+	pkdmsg.cost		= hdr->cost;
+	SAFECOPY(pkdmsg.time,hdr->time);
+	(void)fwrite(&pkdmsg		,sizeof(pkdmsg)			,1,stream);
 
 	/* Write variable-length (ASCIIZ) header fields */
-	fwrite(fmsghdr.to	,strlen(fmsghdr.to)+1	,1,stream);
-	fwrite(fmsghdr.from	,strlen(fmsghdr.from)+1	,1,stream);
-	fwrite(fmsghdr.subj	,strlen(fmsghdr.subj)+1	,1,stream);
+	(void)fwrite(hdr->to	,strlen(hdr->to)+1	,1,stream);
+	(void)fwrite(hdr->from	,strlen(hdr->from)+1	,1,stream);
+	(void)fwrite(hdr->subj	,strlen(hdr->subj)+1	,1,stream);
 
 	if(area.tag == NULL && strstr(fbuf, "\1INTL ") == NULL)	/* NetMail, so add FSC-0004 INTL kludge */
-		fwrite_intl_control_line(stream, &fmsghdr);			/* If not already present */
+		fwrite_intl_control_line(stream, hdr);			/* If not already present */
 
 	len = strlen((char *)fbuf);
 
@@ -3658,7 +3686,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 	if(area.tag)
 		if(strncmp((char *)fbuf,"AREA:",5))                     /* No AREA: Line */
 			fprintf(stream,"AREA:%s\r",area.tag);				/* So add one */
-	fwrite(fbuf,len,1,stream);
+	(void)fwrite(fbuf,len,1,stream);
 	lastlen=9;
 	if(len && fbuf[len-1]!='\r')
 		fputc('\r',stream);
@@ -3667,8 +3695,8 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 		fwrite_via_control_line(stream, &addr);
 	} else { /* EchoMail, Not NetMail */
 
-		if(foreign_zone(addr.zone, fmsghdr.destzone))	/* Zone Gate */
-			fprintf(stream,"SEEN-BY: %d/%d\r",fmsghdr.destnet,fmsghdr.destnode);
+		if(foreign_zone(addr.zone, hdr->destzone))	/* Zone Gate */
+			fprintf(stream,"SEEN-BY: %d/%d\r",hdr->destnet,hdr->destnode);
 		else {
 			fprintf(stream,"SEEN-BY:");
 			for(u=0;u<seenbys.addrs;u++) {			  /* Put back original SEEN-BYs */
@@ -3684,7 +3712,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 				sprintf(str,"%d",seenbys.addr[u].node);
 				strcat(seenby,str);
 				if(lastlen+strlen(seenby)<80) {
-					fwrite(seenby,strlen(seenby),1,stream);
+					(void)fwrite(seenby,strlen(seenby),1,stream);
 					lastlen+=strlen(seenby); 
 				}
 				else {
@@ -3715,7 +3743,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 					sprintf(str,"%d",area.link[u].node);
 					strcat(seenby,str);
 					if(lastlen+strlen(seenby)<80) {
-						fwrite(seenby,strlen(seenby),1,stream);
+						(void)fwrite(seenby,strlen(seenby),1,stream);
 						lastlen+=strlen(seenby); 
 					}
 					else {
@@ -3744,7 +3772,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 					sprintf(str,"%d",scfg.faddr[u].node);
 					strcat(seenby,str);
 					if(lastlen+strlen(seenby)<80) {
-						fwrite(seenby,strlen(seenby),1,stream);
+						(void)fwrite(seenby,strlen(seenby),1,stream);
 						lastlen+=strlen(seenby); 
 					}
 					else {
@@ -3759,7 +3787,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 			lastlen=7;
 			net_exists=0;
 			fprintf(stream,"\r\1PATH:");
-			addr=getsysfaddr(fmsghdr.destzone);
+			addr=getsysfaddr(hdr->destzone);
 			for(u=0;u<paths.addrs;u++) {			  /* Put back the original PATH */
 				if(paths.addr[u].net == 0)
 					continue;	// Invalid node number/address, don't include "0/0" in PATH
@@ -3776,7 +3804,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 				sprintf(str,"%d",paths.addr[u].node);
 				strcat(seenby,str);
 				if(lastlen+strlen(seenby)<80) {
-					fwrite(seenby,strlen(seenby),1,stream);
+					(void)fwrite(seenby,strlen(seenby),1,stream);
 					lastlen+=strlen(seenby); 
 				}
 				else {
@@ -3788,7 +3816,7 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 			}
 
 			strcpy(seenby," ");         /* Add first address with same zone to PATH */
-			sysaddr=getsysfaddr(fmsghdr.destzone);
+			sysaddr=getsysfaddr(hdr->destzone);
 			if(sysaddr.net!=0 && sysaddr.point==0 
 				&& (paths.addrs==0 || lasthop.net!=sysaddr.net || lasthop.node!=sysaddr.node)) {
 				if(sysaddr.net!=addr.net || !net_exists) {
@@ -3800,10 +3828,10 @@ void putfmsg(FILE* stream, const char* fbuf, fmsghdr_t fmsghdr, area_t area
 				sprintf(str,"%d",sysaddr.node);
 				strcat(seenby,str);
 				if(lastlen+strlen(seenby)<80)
-					fwrite(seenby,strlen(seenby),1,stream);
+					(void)fwrite(seenby,strlen(seenby),1,stream);
 				else {
 					fprintf(stream,"\r\1PATH:");
-					fwrite(seenby,strlen(seenby),1,stream); 
+					(void)fwrite(seenby,strlen(seenby),1,stream); 
 				} 
 			}
 			fputc('\r',stream); 
@@ -3825,11 +3853,12 @@ long find_packet_terminator(FILE* stream)
 	uint16_t	terminator = ~FIDO_PACKET_TERMINATOR;
 	long		offset;
 
-	fseek(stream, 0, SEEK_END);
+	if(fseek(stream, 0, SEEK_END) != 0)
+		return 0;
 	offset = ftell(stream);
 	if(offset >= sizeof(fpkthdr_t)+sizeof(terminator)) {
-		fseek(stream, offset-sizeof(terminator), SEEK_SET);
-		if(fread(&terminator, sizeof(terminator), 1, stream)
+		(void)fseek(stream, offset-sizeof(terminator), SEEK_SET);
+		if(fread(&terminator, 1, sizeof(terminator), stream) == sizeof(terminator)
 			&& terminator==FIDO_PACKET_TERMINATOR)
 			offset -= sizeof(terminator);
 	}
@@ -4086,10 +4115,13 @@ outpkt_t* get_outpkt(fidoaddr_t orig, fidoaddr_t dest, nodecfg_t* nodecfg)
 	}
 	if((pkt->filename = strdup(pktname(cfg.temp_dir))) == NULL) {
 		lprintf(LOG_CRIT, "Memory allocation error, line %u", __LINE__);
+		free(pkt);
 		return NULL;
 	}
 	if((pkt->fp = fopen(pkt->filename, "wb")) == NULL) {
 		lprintf(LOG_ERR, "ERROR %u (%s) opening/creating %s", errno, strerror(errno), pkt->filename);
+		free(pkt->filename);
+		free(pkt);
 		return NULL;
 	}
 
@@ -4100,7 +4132,7 @@ outpkt_t* get_outpkt(fidoaddr_t orig, fidoaddr_t dest, nodecfg_t* nodecfg)
 		,smb_faddrtoa(&orig, str), smb_faddrtoa(&dest, NULL), pkt->filename);
 	fpkthdr_t pkthdr;
 	new_pkthdr(&pkthdr, orig, dest, nodecfg);
-	fwrite(&pkthdr, sizeof(pkthdr), 1, pkt->fp);
+	(void)fwrite(&pkthdr, sizeof(pkthdr), 1, pkt->fp);
 	listAddNode(&outpkt_list, pkt, 0, LAST_NODE);
 	return pkt;
 }
@@ -4109,7 +4141,7 @@ outpkt_t* get_outpkt(fidoaddr_t orig, fidoaddr_t dest, nodecfg_t* nodecfg)
  This is where we put outgoing messages into packets.
 ******************************************************************************/
 void pkt_to_pkt(const char *fbuf, area_t area, const fidoaddr_t* faddr
-	,fmsghdr_t fmsghdr, addrlist_t seenbys, addrlist_t paths)
+	,fmsghdr_t* hdr, addrlist_t seenbys, addrlist_t paths)
 {
 	unsigned u;
 	fidoaddr_t sysaddr;
@@ -4119,10 +4151,10 @@ void pkt_to_pkt(const char *fbuf, area_t area, const fidoaddr_t* faddr
 			continue;
 		if(check_psb(&seenbys, area.link[u]))
 			continue;
-		if(fmsghdr.origzone == area.link[u].zone
-			&& fmsghdr.orignet == area.link[u].net
-			&& fmsghdr.orignode == area.link[u].node
-			&& fmsghdr.origpoint == area.link[u].point)
+		if(hdr->origzone == area.link[u].zone
+			&& hdr->orignet == area.link[u].net
+			&& hdr->orignode == area.link[u].node
+			&& hdr->origpoint == area.link[u].point)
 			continue;	/* Don't loop messages back to originator */
 		nodecfg_t* nodecfg = findnodecfg(&cfg, area.link[u],0);
 		if(nodecfg != NULL && nodecfg->passive)
@@ -4134,12 +4166,12 @@ void pkt_to_pkt(const char *fbuf, area_t area, const fidoaddr_t* faddr
 			lprintf(LOG_ERR, "ERROR Creating/opening outbound packet for %s", smb_faddrtoa(&area.link[u], NULL));
 			bail(1);
 		}
-		fmsghdr.destnode	= area.link[u].node;
-		fmsghdr.destnet		= area.link[u].net;
-		fmsghdr.destzone	= area.link[u].zone;
+		hdr->destnode	= area.link[u].node;
+		hdr->destnet		= area.link[u].net;
+		hdr->destzone	= area.link[u].zone;
 		lprintf(LOG_DEBUG, "Adding %s message from %s (%s) to packet for %s: %s"
-			,area.tag, fmsghdr.from, fmsghdr_srcaddr_str(&fmsghdr), smb_faddrtoa(&area.link[u], NULL), pkt->filename);
-		putfmsg(pkt->fp, fbuf, fmsghdr, area, seenbys, paths); 
+			,area.tag, hdr->from, fmsghdr_srcaddr_str(hdr), smb_faddrtoa(&area.link[u], NULL), pkt->filename);
+		putfmsg(pkt->fp, fbuf, hdr, area, seenbys, paths); 
 	}
 }
 
@@ -4159,20 +4191,29 @@ int pkt_to_msg(FILE* fidomsg, fmsghdr_t* hdr, const char* info, const char* inbo
 		printf("Empty NetMail");
 	else {
 		printf("Exporting: ");
-		MKDIR(scfg.netmail_dir);
+		if(!isdir(scfg.netmail_dir) && MKDIR(scfg.netmail_dir) != 0) {
+			lprintf(LOG_ERR, "Error %u (%s) line %d creating directory: %s"
+				,errno, strerror(errno), __LINE__, scfg.netmail_dir);
+			free(fmsgbuf);
+			return -2;
+		}
 		for(i=1;i;i++) {
 			SAFEPRINTF2(path, "%s%u.msg", scfg.netmail_dir, i);
 			if(!fexistcase(path))
 				break; 
-			if(terminated)
+			if(terminated) {
+				free(fmsgbuf);
 				return 1;
+			}
 		}
 		if(!i) {
 			lprintf(LOG_WARNING,"Too many netmail messages");
+			free(fmsgbuf);
 			return(-1); 
 		}
 		if((file=nopen(path,O_WRONLY|O_CREAT))==-1) {
 			lprintf(LOG_ERR,"ERROR %u (%s) line %d creating %s",errno,strerror(errno),__LINE__,path);
+			free(fmsgbuf);
 			return(-1);
 		}
 		if(hdr->attr&FIDO_FILE) {	/* File attachment (only a single file supported) */
@@ -4180,8 +4221,8 @@ int pkt_to_msg(FILE* fidomsg, fmsghdr_t* hdr, const char* info, const char* inbo
 			SAFECOPY(fname, getfname(hdr->subj));
 			SAFEPRINTF2(hdr->subj, "%s%s", inbound, fname);	/* Fix the file path in the subject */
 		}
-		write(file,hdr,sizeof(fmsghdr_t));
-		write(file,fmsgbuf,l+1); /* Write the '\0' terminator too */
+		(void)write(file,hdr,sizeof(fmsghdr_t));
+		(void)write(file,fmsgbuf,l+1); /* Write the '\0' terminator too */
 		close(file);
 		printf("%s", path);
 		lprintf(LOG_INFO,"%s Exported to %s",info,path);
@@ -4298,8 +4339,8 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fp, const char* inboun
 			}
 			else {
 				hdr.attr|=FIDO_RECV;
-				fseek(fp,0L,SEEK_SET);
-				fwrite(&hdr,sizeof(fmsghdr_t),1,fp);
+				(void)fseek(fp,0L,SEEK_SET);
+				(void)fwrite(&hdr,sizeof(fmsghdr_t),1,fp);
 				fclose(fp); /* Gotta close it here for areafix stuff */
 			}
 		}
@@ -4345,7 +4386,9 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fp, const char* inboun
 				}
 				SAFEPRINTF(subj, "Pong: %s", hdr.subj);
 				create_netmail(/* to: */hdr.from, /* msg: */NULL, subj, body, addr, /* file_attached: */false);
-				FREE_AND_NULL(body);
+				if(body != fmsgbuf) {
+					FREE_AND_NULL(body);
+				}
 			} else {	/* AreaFix */
 				p=process_areafix(addr,fmsgbuf,/* Password: */hdr.subj, /* To: */hdr.from);
 				if(p != NULL && cfg.areamgr[0] != 0) {
@@ -4356,7 +4399,7 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fp, const char* inboun
 						SAFECOPY(hdr.from, "SBBSecho");
 						hdr.origzone=hdr.orignet=hdr.orignode=hdr.origpoint=0;
 						hdr.time[0] = 0;	/* Generate a new timestamp */
-						if(fmsgtosmsg(p,hdr,notify,INVALID_SUB) == IMPORT_SUCCESS) {
+						if(fmsgtosmsg(p, &hdr, notify, INVALID_SUB) == IMPORT_SUCCESS) {
 							sprintf(str,"\7\1n\1hSBBSecho \1n\1msent you mail\r\n");
 							putsmsg(&scfg,notify,str); 
 						}
@@ -4392,7 +4435,7 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fp, const char* inboun
 
 	fmsgbuf=getfmsg(fp,&length);
 
-	switch(i=fmsgtosmsg(fmsgbuf,hdr,usernumber,INVALID_SUB)) {
+	switch(i=fmsgtosmsg(fmsgbuf, &hdr, usernumber, INVALID_SUB)) {
 		case IMPORT_SUCCESS:			/* success */
 			break;
 		case IMPORT_FILTERED_DUPE:		/* filtered */
@@ -4472,11 +4515,9 @@ static uint32_t read_export_ptr(int subnum, const char* tag)
 {
 	char		path[MAX_PATH+1];
 	char		key[INI_MAX_VALUE_LEN];
-	int			file;
 	FILE*		fp;
 	uint32_t	ptr=0;
 
-	/* New way (July-21-2012): */
 	safe_snprintf(path,sizeof(path),"%s%s.ini",scfg.sub[subnum]->data_dir,scfg.sub[subnum]->code);
 	if((fp=iniOpenFile(path, /* create: */false)) != NULL) {
 		safe_snprintf(key, sizeof(key), "%s.export_ptr", tag);
@@ -4484,13 +4525,6 @@ static uint32_t read_export_ptr(int subnum, const char* tag)
 			ptr=iniReadLongInt(fp, "SBBSecho", "export_ptr", 0);	/* the previous .ini method (did not support gating) */
 		iniCloseFile(fp);
 	}
-	if(ptr)	return ptr;
-	/* Old way: */
-	safe_snprintf(path,sizeof(path),"%s%s.sfp",scfg.sub[subnum]->data_dir,scfg.sub[subnum]->code);
-	if((file=nopen(path,O_RDONLY)) != -1) {
-		read(file,&ptr,sizeof(ptr));
-		close(file); 
-	}
 	return ptr;
 }
 
@@ -4821,7 +4855,7 @@ void export_echomail(const char* sub_code, const nodecfg_t* nodecfg, bool rescan
 				if(cfg.area[u].sub == subnum) {
 					cfg.area[u].exported++;
 					pkt_to_pkt(fmsgbuf, cfg.area[u]
-						,nodecfg ? &nodecfg->addr : NULL, hdr, msg_seen, msg_path);
+						,nodecfg ? &nodecfg->addr : NULL, &hdr, msg_seen, msg_path);
 					break; 
 				}
 			}
@@ -5116,7 +5150,7 @@ int export_netmail(void)
 					,i, email->last_error, msg.hdr.number);
 			if(msg.hdr.auxattr&MSG_FILEATTACH)
 				delfattach(&scfg,&msg);
-			fseek(email->sid_fp, (msg.offset+1)*sizeof(msg.idx), SEEK_SET);
+			(void)fseek(email->sid_fp, (msg.offset+1)*sizeof(msg.idx), SEEK_SET);
 		} else {
 			/* Just mark as "sent" */
 			msg.hdr.netattr |= MSG_SENT;
@@ -5174,7 +5208,7 @@ bool netmail_sent(const char* fname)
 	}
 	hdr.attr|=FIDO_SENT;
 	rewind(fp);
-	fwrite(&hdr, sizeof(hdr), 1, fp);
+	(void)fwrite(&hdr, sizeof(hdr), 1, fp);
 	fclose(fp);
 	if(!cfg.ignore_netmail_kill_attr && (hdr.attr&FIDO_KILLSENT))
 		return delfile(fname, __LINE__);
@@ -5259,6 +5293,8 @@ void pack_netmail(void)
 			if(!bso_lock_node(addr))
 				continue;
 			outbound = get_current_outbound(addr, /* fileboxes: */true);
+			if(outbound == NULL)
+				continue;
 			if(addr.point)
 				SAFEPRINTF2(req,"%s%08x.req",outbound,addr.point);
 			else
@@ -5280,9 +5316,10 @@ void pack_netmail(void)
 			,hdr.from, fmsghdr_srcaddr_str(&hdr)
 			,hdr.to, smb_faddrtoa(&addr,NULL)
 			,hdr.attr, hdr.subj);
+		FREE_AND_NULL(fmsgbuf);
 		fmsgbuf=getfmsg(fidomsg,NULL);
 		fclose(fidomsg);
-		if(!fmsgbuf) {
+		if(fmsgbuf == NULL) {
 			lprintf(LOG_ERR,"ERROR line %d allocating memory for NetMail fmsgbuf"
 				,__LINE__);
 			bail(1); 
@@ -5301,6 +5338,8 @@ void pack_netmail(void)
 
 		if(cfg.flo_mailer) {
 			outbound = get_current_outbound(addr, /* fileboxes: */true);
+			if(outbound == NULL)
+				continue;
 			if(nodecfg!=NULL && nodecfg->outbox[0])
 				SAFECOPY(packet, pktname(outbound));
 			else {
@@ -5345,14 +5384,14 @@ void pack_netmail(void)
 			chsize(file,0);
 			rewind(stream);
 			new_pkthdr(&pkthdr, getsysfaddr(addr.zone), addr, nodecfg);
-			fwrite(&pkthdr,sizeof(pkthdr),1,stream); 
+			(void)fwrite(&pkthdr,sizeof(pkthdr),1,stream); 
 		} else
-			fseek(stream,find_packet_terminator(stream),SEEK_SET);
+			(void)fseek(stream,find_packet_terminator(stream),SEEK_SET);
 
 		lprintf(LOG_DEBUG, "Adding NetMail (%s) to %spacket for %s: %s"
 			,getfname(path)
 			,newpkt, smb_faddrtoa(&addr, NULL), packet);
-		putfmsg(stream,fmsgbuf,hdr,fakearea,msg_seen,msg_path);
+		putfmsg(stream, fmsgbuf, &hdr, fakearea, msg_seen, msg_path);
 
 		/* Write packet terminator */
 		terminate_packet(stream);
@@ -5367,6 +5406,7 @@ void pack_netmail(void)
 		packed_netmail++;
 	}
 	globfree(&g);
+	FREE_AND_NULL(fmsgbuf);
 }
 
 /* Find any packets that have been left behind in the temp directory */
@@ -5414,8 +5454,8 @@ void find_stray_packets(void)
 			continue; 
 		}
 		terminator = ~FIDO_PACKET_TERMINATOR;
-		fseek(fp, flen-sizeof(terminator), SEEK_SET);
-		fread(&terminator, sizeof(terminator), 1, fp);
+		(void)fseek(fp, flen-sizeof(terminator), SEEK_SET);
+		(void)fread(&terminator, sizeof(terminator), 1, fp);
 		fclose(fp);
 		if(!parse_pkthdr(&pkthdr, &pkt_orig, &pkt_dest, &pkt_type)) {
 			lprintf(LOG_WARNING,"Failure to parse packet (%s) header, type: %u"
@@ -5457,6 +5497,8 @@ bool rename_bad_packet(const char* packet)
 	char badpkt[MAX_PATH+1];
 	SAFECOPY(badpkt, packet);
 	char* ext = getfext(badpkt);
+	if(ext == NULL)
+		return false;
 	strcpy(ext, ".bad");
 	if(mv(packet, badpkt, /* copy: */false) == 0)
 		return true;
@@ -5517,15 +5559,15 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 		}
 
 		terminator = ~FIDO_PACKET_TERMINATOR;
-		fseek(fidomsg, -(int)sizeof(terminator), SEEK_END);
-		fread(&terminator,sizeof(terminator),1,fidomsg);
-		if(terminator != FIDO_PACKET_TERMINATOR) {
+		(void)fseek(fidomsg, -(int)sizeof(terminator), SEEK_END);
+		if(fread(&terminator, 1, sizeof(terminator), fidomsg) != sizeof(terminator)
+			|| terminator != FIDO_PACKET_TERMINATOR) {
 			fclose(fidomsg);
 			lprintf(LOG_WARNING,"WARNING: packet %s not terminated correctly (0x%04hX)", packet, terminator);
 			rename_bad_packet(packet);
 			continue; 
 		}
-		fseek(fidomsg,0L,SEEK_SET);
+		(void)fseek(fidomsg,0L,SEEK_SET);
 		if(fread(&pkthdr,sizeof(pkthdr),1,fidomsg)!=1) {
 			fclose(fidomsg);
 			lprintf(LOG_ERR,"ERROR line %d reading %u bytes from %s",__LINE__
@@ -5610,9 +5652,9 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 			hdr.attr&=~FIDO_LOCAL;	/* Strip local bit, obviously not created locally */
 
 			if(strncmp(fmsgbuf, "AREA:", 5) != 0) {					/* Netmail */
-				fseek(fidomsg, msg_offset, SEEK_SET);
+				(void)fseek(fidomsg, msg_offset, SEEK_SET);
 				import_netmail("", hdr, fidomsg, inbound);
-				fseek(fidomsg, next_msg, SEEK_SET);
+				(void)fseek(fidomsg, next_msg, SEEK_SET);
 				printf("\n");
 				continue; 
 			}
@@ -5633,7 +5675,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 				lprintf(LOG_WARNING, "%s: Failed to parse Origin Line in message from %s (%s) in packet from %s: %s"
 					, areatag, hdr.from, fmsghdr_srcaddr_str(&hdr), smb_faddrtoa(&pkt_orig, NULL), packet);
 
-			new_echostat_msg(stat, ECHOSTAT_MSG_RECEIVED, fidomsg_to_echostat_msg(hdr, &pkt_orig, fmsgbuf));
+			new_echostat_msg(stat, ECHOSTAT_MSG_RECEIVED, fidomsg_to_echostat_msg(&hdr, &pkt_orig, fmsgbuf));
 
 			if(!opt_import_echomail) {
 				printf("EchoMail Ignored");
@@ -5692,7 +5734,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 
 			if(cfg.area[i].sub==INVALID_SUB) {			/* Passthru */
 				strip_psb(fmsgbuf);
-				pkt_to_pkt(fmsgbuf,curarea,NULL,hdr,msg_seen,msg_path);
+				pkt_to_pkt(fmsgbuf, curarea, NULL, &hdr, msg_seen, msg_path);
 				printf("\n");
 				continue; 
 			} 						/* On to the next message */
@@ -5709,7 +5751,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 						,areatag,smb_faddrtoa(&scfg.faddr[j],NULL), hdr.from, fmsghdr_srcaddr_str(&hdr));
 					printf("\n");
 					new_echostat_msg(stat, ECHOSTAT_MSG_CIRCULAR
-						,fidomsg_to_echostat_msg(hdr, &pkt_orig, fmsgbuf));
+						,fidomsg_to_echostat_msg(&hdr, &pkt_orig, fmsgbuf));
 					continue; 
 				}
 			}
@@ -5736,7 +5778,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 					fputs(str,stdout);
 					lprintf(LOG_ERR, "%s", str);
 					strip_psb(fmsgbuf);
-					pkt_to_pkt(fmsgbuf,curarea,NULL,hdr,msg_seen,msg_path);
+					pkt_to_pkt(fmsgbuf, curarea, NULL, &hdr, msg_seen, msg_path);
 					printf("\n");
 					continue; 
 				}
@@ -5752,7 +5794,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 						lprintf(LOG_ERR, "%s", str);
 						smb_close(&smb[cur_smb]);
 						strip_psb(fmsgbuf);
-						pkt_to_pkt(fmsgbuf,curarea,NULL,hdr,msg_seen,msg_path);
+						pkt_to_pkt(fmsgbuf, curarea, NULL, &hdr, msg_seen, msg_path);
 						printf("\n");
 						continue; 
 					} 
@@ -5765,7 +5807,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 				lprintf(LOG_NOTICE, "%s: Private posts disallowed from %s (%s) to %s, subject: %s"
 					,areatag, hdr.from, fmsghdr_srcaddr_str(&hdr), hdr.to, hdr.subj);
 				strip_psb(fmsgbuf);
-				pkt_to_pkt(fmsgbuf,curarea,NULL,hdr,msg_seen,msg_path);
+				pkt_to_pkt(fmsgbuf, curarea, NULL,&hdr, msg_seen, msg_path);
 				printf("\n");
 				continue; 
 			}
@@ -5776,18 +5818,18 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 			/**********************/
 			/* Importing EchoMail */
 			/**********************/
-			result=fmsgtosmsg(fmsgbuf,hdr,0,cfg.area[i].sub);
+			result=fmsgtosmsg(fmsgbuf, &hdr, 0, cfg.area[i].sub);
 
 			if(result==IMPORT_FILTERED_DUPE) {
 				lprintf(LOG_NOTICE, "%s Duplicate message from %s (%s) to %s, subject: %s"
 					,areatag, hdr.from, fmsghdr_srcaddr_str(&hdr), hdr.to, hdr.subj);
 				cfg.area[i].dupes++; 
 				new_echostat_msg(stat, ECHOSTAT_MSG_DUPLICATE
-					,fidomsg_to_echostat_msg(hdr, &pkt_orig, fmsgbuf));
+					,fidomsg_to_echostat_msg(&hdr, &pkt_orig, fmsgbuf));
 			}
 			else if(result==IMPORT_SUCCESS || (result==IMPORT_FILTERED_AGE && cfg.relay_filtered_msgs)) {	   /* Not a dupe */
 				strip_psb(fmsgbuf);
-				pkt_to_pkt(fmsgbuf,curarea,NULL,hdr,msg_seen,msg_path); 
+				pkt_to_pkt(fmsgbuf, curarea, NULL, &hdr, msg_seen, msg_path); 
 			}
 
 			if(result==SMB_SUCCESS) {		/* Successful import */
@@ -5806,7 +5848,7 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
 				echomail++;
 				cfg.area[i].imported++;
 				new_echostat_msg(stat, ECHOSTAT_MSG_IMPORTED
-					,fidomsg_to_echostat_msg(hdr, &pkt_orig, fmsgbuf));
+					,fidomsg_to_echostat_msg(&hdr, &pkt_orig, fmsgbuf));
 			}
 			printf("\n");
 		}
@@ -5959,6 +6001,7 @@ int main(int argc, char **argv)
 						break;
 					default:
 						fprintf(stderr, "Unsupported option: %c\n", argv[i][j]);
+						/* Fall-through */
 					case '?':
 						printf("%s", usage);
 						bail(0); 
@@ -6383,8 +6426,8 @@ int main(int argc, char **argv)
 				}
 				else {
 					hdr.attr|=FIDO_RECV;
-					fseek(fidomsg,0L,SEEK_SET);
-					fwrite(&hdr,sizeof(fmsghdr_t),1,fidomsg);
+					(void)fseek(fidomsg,0L,SEEK_SET);
+					(void)fwrite(&hdr,sizeof(fmsghdr_t),1,fidomsg);
 					fclose(fidomsg); 
 				} 
 			}
-- 
GitLab