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