From 6859df9e3b44230341db6b847cd0b047adfbd3ad Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Fri, 10 Sep 2004 09:49:30 +0000 Subject: [PATCH] Added return value checking in smb_addmsg() for calls to smb_dfield(), smb_hfield(), smb_hfield_str(), smb_fwrite(), and smb_fputc(). --- src/smblib/smblib.c | 71 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index 9f5e39df95..e92ba8a124 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -1621,31 +1621,74 @@ int SMBCALL smb_addmsg(smb_t* smb, smbmsg_t* msg, int storage, BOOL dupechk smb_fseek(smb->sdt_fp,offset,SEEK_SET); if(bodylen) { - smb_dfield(msg,TEXT_BODY,bodylen); + if((retval=smb_dfield(msg,TEXT_BODY,bodylen))!=SMB_SUCCESS) + break; xlatlen=0; if(xlat!=XLAT_NONE) { /* e.g. XLAT_LZH */ - smb_fwrite(smb,&xlat,sizeof(xlat),smb->sdt_fp); + if(smb_fwrite(smb,&xlat,sizeof(xlat),smb->sdt_fp)!=sizeof(xlat)) { + safe_snprintf(smb->last_error,sizeof(smb->last_error) + ,"%d (%s) writing body xlat string" + ,ferror(smb->sdt_fp),STRERROR(ferror(smb->sdt_fp))); + retval=SMB_ERR_WRITE; + break; + } xlatlen+=sizeof(xlat); } xlat=XLAT_NONE; /* xlat string terminator */ - smb_fwrite(smb,&xlat,sizeof(xlat),smb->sdt_fp); + if(smb_fwrite(smb,&xlat,sizeof(xlat),smb->sdt_fp)!=sizeof(xlat)) { + safe_snprintf(smb->last_error,sizeof(smb->last_error) + ,"%d (%s) writing body xlat terminator" + ,ferror(smb->sdt_fp),STRERROR(ferror(smb->sdt_fp))); + retval=SMB_ERR_WRITE; + break; + } xlatlen+=sizeof(xlat); - smb_fwrite(smb,body,bodylen-xlatlen,smb->sdt_fp); + if(smb_fwrite(smb,body,bodylen-xlatlen,smb->sdt_fp)!=bodylen-xlatlen) { + safe_snprintf(smb->last_error,sizeof(smb->last_error) + ,"%d (%s) writing body (%ld bytes)" + ,ferror(smb->sdt_fp),STRERROR(ferror(smb->sdt_fp)) + ,bodylen-xlatlen); + retval=SMB_ERR_WRITE; + break; + } } if(taillen) { - smb_dfield(msg,TEXT_TAIL,taillen); + if((retval=smb_dfield(msg,TEXT_TAIL,taillen))!=SMB_SUCCESS) + break; xlat=XLAT_NONE; /* xlat string terminator */ - smb_fwrite(smb,&xlat,sizeof(xlat),smb->sdt_fp); + if(smb_fwrite(smb,&xlat,sizeof(xlat),smb->sdt_fp)!=sizeof(xlat)) { + safe_snprintf(smb->last_error,sizeof(smb->last_error) + ,"%d (%s) writing tail xlat terminator" + ,ferror(smb->sdt_fp),STRERROR(ferror(smb->sdt_fp))); + retval=SMB_ERR_WRITE; + break; + } - smb_fwrite(smb,tail,taillen-sizeof(xlat),smb->sdt_fp); + if(smb_fwrite(smb,tail,taillen-sizeof(xlat),smb->sdt_fp)!=taillen-sizeof(xlat)) { + safe_snprintf(smb->last_error,sizeof(smb->last_error) + ,"%d (%s) writing tail (%ld bytes)" + ,ferror(smb->sdt_fp),STRERROR(ferror(smb->sdt_fp)) + ,taillen-sizeof(xlat)); + retval=SMB_ERR_WRITE; + break; + } } - for(l=length;l%SDT_BLOCK_LEN;l++) - smb_fputc(0,smb->sdt_fp); + for(l=length;l%SDT_BLOCK_LEN;l++) { + if(smb_fputc(0,smb->sdt_fp)!=0) + break; + } + if(l%SDT_BLOCK_LEN) { + safe_snprintf(smb->last_error,sizeof(smb->last_error) + ,"%d (%s) writing data padding" + ,ferror(smb->sdt_fp),STRERROR(ferror(smb->sdt_fp))); + retval=SMB_ERR_WRITE; + break; + } fflush(smb->sdt_fp); @@ -1683,12 +1726,14 @@ int SMBCALL smb_addmsg(smb_t* smb, smbmsg_t* msg, int storage, BOOL dupechk } /* Add RFC-822 Reply-ID if original message has RFC Message-ID */ - if(msg->reply_id==NULL && remsg.id!=NULL) - smb_hfield_str(msg,RFC822REPLYID,remsg.id); + if(msg->reply_id==NULL && remsg.id!=NULL + && (retval=smb_hfield_str(msg,RFC822REPLYID,remsg.id))!=SMB_SUCCESS) + break; /* Add FidoNet Reply if original message has FidoNet MSGID */ - if(msg->ftn_reply==NULL && remsg.ftn_msgid!=NULL) - smb_hfield_str(msg,FIDOREPLYID,remsg.ftn_msgid); + if(msg->ftn_reply==NULL && remsg.ftn_msgid!=NULL + && (retval=smb_hfield_str(msg,FIDOREPLYID,remsg.ftn_msgid))!=SMB_SUCCESS) + break; retval=smb_updatethread(smb, &remsg, msg->hdr.number); smb_unlockmsghdr(smb, &remsg); -- GitLab