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