diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index d9dba8d46a8decf80a92531cdb451c5e9b74a293..89fe3fce76261f774547f3e3b2755dff32f3dea9 100644 --- a/src/sbbs3/userdat.c +++ b/src/sbbs3/userdat.c @@ -54,7 +54,7 @@ uint matchuser(scfg_t* cfg, const char *name, BOOL sysop_alias) int file,c; char dat[LEN_ALIAS+2]; char str[256]; - ulong l,length; + off_t l,length; FILE* stream; if(!VALID_CFG(cfg) || name==NULL) @@ -67,9 +67,13 @@ uint matchuser(scfg_t* cfg, const char *name, BOOL sysop_alias) SAFEPRINTF(str,"%suser/name.dat",cfg->data_dir); if((stream=fnopen(&file,str,O_RDONLY))==NULL) return(0); - length=(long)filelength(file); - for(l=0;l<length;l+=LEN_ALIAS+2) { - fread(dat,sizeof(dat),1,stream); + length = filelength(file); + if(length < sizeof(dat)) { + fclose(stream); + return 0; + } + for(l = 0; l < length; l += sizeof(dat)) { + (void)fread(dat,sizeof(dat),1,stream); for(c=0;c<LEN_ALIAS;c++) if(dat[c]==ETX) break; dat[c]=0; @@ -78,7 +82,7 @@ uint matchuser(scfg_t* cfg, const char *name, BOOL sysop_alias) } fclose(stream); if(l<length) - return((l/(LEN_ALIAS+2))+1); + return (uint)((l/(LEN_ALIAS+2))+1); return(0); } @@ -127,14 +131,16 @@ uint total_users(scfg_t* cfg) if((file=openuserdat(cfg, /* for_modify: */FALSE)) < 0) return(0); length=(long)filelength(file); - for(l=0;l<length;l+=U_LEN) { - lseek(file,l+U_MISC,SEEK_SET); - if(read(file,str,8)!=8) - continue; - getrec(str,0,8,str); - if(ahtoul(str)&(DELETED|INACTIVE)) - continue; - total_users++; + if(length >= U_LEN) { + for(l=0;l<length;l+=U_LEN) { + (void)lseek(file,l+U_MISC,SEEK_SET); + if(read(file,str,8)!=8) + continue; + getrec(str,0,8,str); + if(ahtoul(str)&(DELETED|INACTIVE)) + continue; + total_users++; + } } close(file); return(total_users); @@ -227,7 +233,7 @@ int readuserdat(scfg_t* cfg, unsigned user_number, char* userdat, int infile) return(-1); /* no such user record */ } - lseek(file,(long)((long)(user_number-1)*U_LEN),SEEK_SET); + (void)lseek(file,(long)((long)(user_number-1)*U_LEN),SEEK_SET); i=0; while(i<LOOP_NODEDAB && lock(file,(long)((long)(user_number-1)*U_LEN),U_LEN)==-1) { @@ -615,7 +621,7 @@ int putuserdat(scfg_t* cfg, user_t* user) return(-4); } - lseek(file,(long)((long)((long)user->number-1)*U_LEN),SEEK_SET); + (void)lseek(file,(long)((long)((long)user->number-1)*U_LEN),SEEK_SET); i=0; while(i<LOOP_NODEDAB @@ -673,8 +679,8 @@ char* username(scfg_t* cfg, int usernumber, char *name) name[0]=0; return(name); } - lseek(file,(long)((long)(usernumber-1)*(LEN_ALIAS+2)),SEEK_SET); - read(file,name,LEN_ALIAS); + (void)lseek(file,(long)((long)(usernumber-1)*(LEN_ALIAS+2)),SEEK_SET); + (void)read(file,name,LEN_ALIAS); close(file); for(c=0;c<LEN_ALIAS;c++) if(name[c]==ETX) break; @@ -692,8 +698,8 @@ int putusername(scfg_t* cfg, int number, const char *name) char str[256]; int file; int wr; - long length; - uint total_users; + off_t length; + off_t total_users; if(!VALID_CFG(cfg) || name==NULL || number<1) return(-1); @@ -701,12 +707,12 @@ int putusername(scfg_t* cfg, int number, const char *name) SAFEPRINTF(str,"%suser/name.dat", cfg->data_dir); if((file=nopen(str,O_RDWR|O_CREAT))==-1) return(errno); - length=(long)filelength(file); + length = filelength(file); /* Truncate corrupted name.dat */ total_users=lastuser(cfg); - if((uint)(length/(LEN_ALIAS+2))>total_users) - chsize(file,total_users*(LEN_ALIAS+2)); + if(length/(LEN_ALIAS+2) > total_users) + chsize(file,(long)(total_users*(LEN_ALIAS+2))); if(length && length%(LEN_ALIAS+2)) { close(file); @@ -715,11 +721,11 @@ int putusername(scfg_t* cfg, int number, const char *name) if(length<(((long)number-1)*(LEN_ALIAS+2))) { SAFEPRINTF2(str,"%*s\r\n",LEN_ALIAS,nulstr); memset(str,ETX,LEN_ALIAS); - lseek(file,0L,SEEK_END); - while(filelength(file)<((long)number*(LEN_ALIAS+2))) - write(file,str,(LEN_ALIAS+2)); + (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)); } - lseek(file,(long)(((long)number-1)*(LEN_ALIAS+2)),SEEK_SET); + (void)lseek(file,(long)(((long)number-1)*(LEN_ALIAS+2)),SEEK_SET); putrec(str,0,LEN_ALIAS,name); putrec(str,LEN_ALIAS,2,crlf); wr=write(file,str,LEN_ALIAS+2); @@ -919,7 +925,7 @@ int getnodedat(scfg_t* cfg, uint number, node_t *node, BOOL lockit, int* fdp) for(count=0;count<LOOP_NODEDAB;count++) { if(count) mswait(100); - lseek(file,(long)number*sizeof(node_t),SEEK_SET); + (void)lseek(file,(long)number*sizeof(node_t),SEEK_SET); if(lockit && lock(file,(long)number*sizeof(node_t),sizeof(node_t))!=0) continue; @@ -962,7 +968,7 @@ int putnodedat(scfg_t* cfg, uint number, node_t* node, BOOL closeit, int file) number--; /* make zero based */ for(attempts=0;attempts<10;attempts++) { - lseek(file,(long)number*sizeof(node_t),SEEK_SET); + (void)lseek(file,(long)number*sizeof(node_t),SEEK_SET); if((wr=write(file,node,sizeof(node_t)))==sizeof(node_t)) break; wrerr=errno; /* save write error */ @@ -1065,8 +1071,8 @@ char* getnodeext(scfg_t* cfg, int num, char* buf) return ""; if((f = opennodeext(cfg)) < 1) return ""; - lseek(f, (num-1) * 128, SEEK_SET); - read(f, buf, 128); + (void)lseek(f, (num-1) * 128, SEEK_SET); + (void)read(f, buf, 128); close(f); buf[127] = 0; return buf; @@ -1330,7 +1336,7 @@ uint userdatdupe(scfg_t* cfg, uint usernumber, uint offset, uint datlen progress(cbdata, l, length); if(usernumber && l/U_LEN==(long)usernumber-1) continue; - lseek(file,l+offset,SEEK_SET); + (void)lseek(file,l+offset,SEEK_SET); i=0; while(i<LOOP_NODEDAB && lock(file,l,U_LEN)==-1) { if(i) @@ -1343,15 +1349,15 @@ uint userdatdupe(scfg_t* cfg, uint usernumber, uint offset, uint datlen return(0); } - read(file,str,datlen); + (void)read(file,str,datlen); for(i=0;i<datlen;i++) if(str[i]==ETX) break; str[i]=0; truncsp(str); if(!stricmp(str,dat)) { if(!del) { /* Don't include deleted users in search */ - lseek(file,l+U_MISC,SEEK_SET); - read(file,str,8); + (void)lseek(file,l+U_MISC,SEEK_SET); + (void)read(file,str,8); getrec(str,0,8,str); if(ahtoul(str)&(DELETED|INACTIVE)) { unlock(file,l,U_LEN); @@ -1503,7 +1509,7 @@ char* getnmsg(scfg_t* cfg, int node_num) if((file=nopen(str,O_RDWR))==-1) return(NULL); length=(long)filelength(file); - if(!length) { + if(length < 1) { close(file); return(NULL); } @@ -1541,7 +1547,7 @@ int putnmsg(scfg_t* cfg, int num, char *strin) SAFEPRINTF2(str,"%smsgs/n%3.3u.msg",cfg->data_dir,num); if((file=nopen(str,O_WRONLY|O_CREAT))==-1) return(errno); - lseek(file,0L,SEEK_END); /* Instead of opening with O_APPEND */ + (void)lseek(file,0L,SEEK_END); /* Instead of opening with O_APPEND */ i=strlen(strin); if(write(file,strin,i)!=i) { close(file); @@ -2198,7 +2204,7 @@ int getuserrec(scfg_t* cfg, int usernumber,int start, int length, char *str) close(file); return(-2); } - lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); + (void)lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); if(length < 1) { /* auto-length */ length=user_rec_len(start); @@ -2332,7 +2338,7 @@ ulong adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj return(0); } - lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); + (void)lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); if(length < 1) { /* auto-length */ length=user_rec_len(start); @@ -2381,7 +2387,7 @@ ulong adjustuserrec(scfg_t* cfg, int usernumber, int start, int length, long adj sval += (ushort)adj; val = sval; } - lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); + (void)lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); putrec(str,0,length,ultoa(val,tmp,10)); if(write(file,str,length)!=length) { unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length); @@ -2845,11 +2851,11 @@ int newuserdat(scfg_t* cfg, user_t* user) if((file=nopen(str,O_RDWR))==-1) continue; memset(&stats,0,sizeof(stats)); - lseek(file,4L,SEEK_SET); /* Skip timestamp */ - read(file,&stats,sizeof(stats)); + (void)lseek(file,4L,SEEK_SET); /* Skip timestamp */ + (void)read(file,&stats,sizeof(stats)); stats.nusers++; - lseek(file,4L,SEEK_SET); - write(file,&stats,sizeof(stats)); + (void)lseek(file,4L,SEEK_SET); + (void)write(file,&stats,sizeof(stats)); close(file); }