diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index dadfbc1a603c4bedf6eb8662958e54a30a40f745..43db03a5ba12c2ef69b4c61b8f2e35912c1fd90e 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -491,8 +491,9 @@ int SMBCALL smb_lockmsghdr(smb_t* smb, smbmsg_t* msg) int SMBCALL smb_getmsgidx(smb_t* smb, smbmsg_t* msg) { idxrec_t idx; - ulong byte_offset; - ulong l,length,total,bot,top; + long byte_offset; + ulong l,total,bot,top; + long length; if(smb->sid_fp==NULL) { safe_snprintf(smb->last_error,sizeof(smb->last_error),"index not open"); @@ -501,7 +502,7 @@ int SMBCALL smb_getmsgidx(smb_t* smb, smbmsg_t* msg) clearerr(smb->sid_fp); length=filelength(fileno(smb->sid_fp)); - if(length<sizeof(idxrec_t)) { + if(length<(long)sizeof(idxrec_t)) { safe_snprintf(smb->last_error,sizeof(smb->last_error) ,"invalid index file length: %ld",length); return(SMB_ERR_FILE_LEN); @@ -520,7 +521,7 @@ int SMBCALL smb_getmsgidx(smb_t* smb, smbmsg_t* msg) byte_offset=msg->offset*sizeof(idxrec_t); if(byte_offset>=length) { safe_snprintf(smb->last_error,sizeof(smb->last_error) - ,"invalid index offset: %ld, byte offset: %lu, length: %lu" + ,"invalid index offset: %ld, byte offset: %ld, length: %ld" ,msg->offset, byte_offset, length); return(SMB_ERR_HDR_OFFSET); } @@ -538,6 +539,8 @@ int SMBCALL smb_getmsgidx(smb_t* smb, smbmsg_t* msg) ,msg->offset,byte_offset); return(SMB_ERR_READ); } + /* Save the correct offset (from the beginning of the file) */ + msg->offset=byte_offset/sizeof(idxrec_t); return(SMB_SUCCESS); } @@ -1458,11 +1461,20 @@ int SMBCALL smb_putmsg(smb_t* smb, smbmsg_t* msg) /****************************************************************************/ int SMBCALL smb_putmsgidx(smb_t* smb, smbmsg_t* msg) { + long length; + if(smb->sid_fp==NULL) { safe_snprintf(smb->last_error,sizeof(smb->last_error),"index not open"); return(SMB_ERR_NOT_OPEN); } clearerr(smb->sid_fp); + length = filelength(fileno(smb->sid_fp)); + if(length < (long)(msg->offset*sizeof(idxrec_t))) { + safe_snprintf(smb->last_error,sizeof(smb->last_error) + ,"invalid index offset: %ld, byte offset: %lu, length: %lu" + ,msg->offset, msg->offset*sizeof(idxrec_t), length); + return(SMB_ERR_HDR_OFFSET); + } if(fseek(smb->sid_fp,msg->offset*sizeof(idxrec_t),SEEK_SET)) { safe_snprintf(smb->last_error,sizeof(smb->last_error) ,"%d '%s' seeking to %u in header" @@ -1476,8 +1488,7 @@ int SMBCALL smb_putmsgidx(smb_t* smb, smbmsg_t* msg) ,get_errno(),STRERROR(get_errno())); return(SMB_ERR_WRITE); } - fflush(smb->sid_fp); - return(SMB_SUCCESS); + return fflush(smb->sid_fp); /* SMB_SUCCESS == 0 */ } /****************************************************************************/ @@ -1577,8 +1588,7 @@ int SMBCALL smb_putmsghdr(smb_t* smb, smbmsg_t* msg) } hdrlen++; } - fflush(smb->shd_fp); - return(SMB_SUCCESS); + return fflush(smb->shd_fp); /* SMB_SUCCESS == 0 */ } /****************************************************************************/