diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index 801f1b266967833626ebf68fe4bca7c659609a4c..b2023b36190fd58c56e5a92d667c12d45c762375 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -1248,48 +1248,50 @@ int SMBCALL smb_addcrc(smb_t* smb, ulong crc) } length=filelength(file); - if(length<0L) { + if(length<0L || length%sizeof(long)) { close(file); sprintf(smb->last_error,"invalid file length: %ld", length); return(SMB_ERR_FILE_LEN); } - if((buf=(ulong*)MALLOC(length))==NULL) { - close(file); - sprintf(smb->last_error - ,"malloc failure of %ld bytes" - ,length); - return(SMB_ERR_MEM); - } + if(length!=0) { + if((buf=(ulong*)MALLOC(length))==NULL) { + close(file); + sprintf(smb->last_error + ,"malloc failure of %ld bytes" + ,length); + return(SMB_ERR_MEM); + } - if(read(file,buf,length)!=length) { - close(file); - FREE(buf); - sprintf(smb->last_error - ,"%d (%s) reading %ld bytes" - ,errno,STRERROR(errno),length); - return(SMB_ERR_READ); - } + if(read(file,buf,length)!=length) { + close(file); + FREE(buf); + sprintf(smb->last_error + ,"%d (%s) reading %ld bytes" + ,errno,STRERROR(errno),length); + return(SMB_ERR_READ); + } - for(l=0;l<length/sizeof(long);l++) - if(crc==buf[l]) - break; - if(l<length/sizeof(long)) { /* Dupe CRC found */ - close(file); - FREE(buf); - sprintf(smb->last_error - ,"duplicate message detected"); - return(SMB_DUPE_MSG); - } + for(l=0;l<length/sizeof(long);l++) + if(crc==buf[l]) + break; + if(l<length/sizeof(long)) { /* Dupe CRC found */ + close(file); + FREE(buf); + sprintf(smb->last_error + ,"duplicate message detected"); + return(SMB_DUPE_MSG); + } - if(length>=(long)(smb->status.max_crcs*sizeof(long))) { - newlen=(smb->status.max_crcs-1)*sizeof(long); - chsize(file,0); /* truncate it */ - lseek(file,0L,SEEK_SET); - write(file,buf+(length-newlen),newlen); + if(length>=(long)(smb->status.max_crcs*sizeof(long))) { + newlen=(smb->status.max_crcs-1)*sizeof(long); + chsize(file,0); /* truncate it */ + lseek(file,0L,SEEK_SET); + write(file,buf+(length-newlen),newlen); + } + FREE(buf); } wr=write(file,&crc,sizeof(crc)); /* Write to the end */ - FREE(buf); close(file); if(wr!=sizeof(crc)) {