diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index ef5c895e1b9ffdba292e10b39c84eb8ab2b7e4de..39ec730f8b93c453ee156c90f73a34fcdda8321b 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -644,6 +644,118 @@ ulong SMBCALL smb_getmsgdatlen(smbmsg_t* msg) return(length); } +static void set_convenience_ptr(smbmsg_t* msg, ushort hfield_type, void* hfield_dat) +{ + switch(hfield_type) { /* convenience variables */ + case SENDER: + if(!msg->from) { + msg->from=(char*)hfield_dat; + break; + } + case FORWARDED: /* fall through */ + msg->forwarded=1; + break; + case SENDERAGENT: + if(!msg->forwarded) + msg->from_agent=*(ushort *)hfield_dat; + break; + case SENDEREXT: + if(!msg->forwarded) + msg->from_ext=(char*)hfield_dat; + break; + case SENDERORG: + if(!msg->forwarded) + msg->from_org=(char*)hfield_dat; + break; + case SENDERNETTYPE: + if(!msg->forwarded) + msg->from_net.type=*(ushort *)hfield_dat; + break; + case SENDERNETADDR: + if(!msg->forwarded) + msg->from_net.addr=(char*)hfield_dat; + break; + case REPLYTO: + msg->replyto=(char*)hfield_dat; + break; + case REPLYTOEXT: + msg->replyto_ext=(char*)hfield_dat; + break; + case REPLYTOAGENT: + msg->replyto_agent=*(ushort *)hfield_dat; + break; + case REPLYTONETTYPE: + msg->replyto_net.type=*(ushort *)hfield_dat; + break; + case REPLYTONETADDR: + msg->replyto_net.addr=(char*)hfield_dat; + break; + case RECIPIENT: + msg->to=(char*)hfield_dat; + break; + case RECIPIENTEXT: + msg->to_ext=(char*)hfield_dat; + break; + case RECIPIENTAGENT: + msg->to_agent=*(ushort *)hfield_dat; + break; + case RECIPIENTNETTYPE: + msg->to_net.type=*(ushort *)hfield_dat; + break; + case RECIPIENTNETADDR: + msg->to_net.addr=(char*)hfield_dat; + break; + case SUBJECT: + msg->subj=(char*)hfield_dat; + break; + case SMB_SUMMARY: + msg->summary=(char*)hfield_dat; + break; + case SMB_EXPIRATION: + msg->expiration=*(time_t*)hfield_dat; + break; + case SMB_PRIORITY: + msg->priority=*(ulong*)hfield_dat; + break; + case SMB_COST: + msg->cost=*(ulong*)hfield_dat; + break; + case RFC822MSGID: + msg->id=(char*)hfield_dat; + break; + case RFC822REPLYID: + msg->reply_id=(char*)hfield_dat; + break; + case SMTPREVERSEPATH: + msg->reverse_path=(char*)hfield_dat; + break; + case USENETPATH: + msg->path=(char*)hfield_dat; + break; + case USENETNEWSGROUPS: + msg->newsgroups=(char*)hfield_dat; + break; + case FIDOMSGID: + msg->ftn_msgid=(char*)hfield_dat; + break; + case FIDOREPLYID: + msg->ftn_reply=(char*)hfield_dat; + break; + case FIDOAREA: + msg->ftn_area=(char*)hfield_dat; + break; + case FIDOPID: + msg->ftn_pid=(char*)hfield_dat; + break; + case FIDOTID: + msg->ftn_tid=(char*)hfield_dat; + break; + case FIDOFLAGS: + msg->ftn_flags=(char*)hfield_dat; + break; + } +} + /****************************************************************************/ /* Read header information into 'msg' structure */ /* msg->idx.offset must be set before calling this function */ @@ -730,7 +842,7 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg) } l+=sizeof(hfield_t); if((msg->hfield_dat[i]=(char*)MALLOC(msg->hfield[i].length+1)) - ==NULL) { /* Allocate 1 extra for NULL terminator */ + ==NULL) { /* Allocate 1 extra for ASCIIZ terminator */ sprintf(smb->last_error ,"malloc failure of %d bytes for header field %d" ,msg->hfield[i].length+1, i); @@ -744,115 +856,8 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg) sprintf(smb->last_error,"reading header field data"); return(-6); } - switch(msg->hfield[i].type) { /* convenience variables */ - case SENDER: - if(!msg->from) { - msg->from=(char*)msg->hfield_dat[i]; - break; - } - case FORWARDED: /* fall through */ - msg->forwarded=1; - break; - case SENDERAGENT: - if(!msg->forwarded) - msg->from_agent=*(ushort *)msg->hfield_dat[i]; - break; - case SENDEREXT: - if(!msg->forwarded) - msg->from_ext=(char*)msg->hfield_dat[i]; - break; - case SENDERORG: - if(!msg->forwarded) - msg->from_org=(char*)msg->hfield_dat[i]; - break; - case SENDERNETTYPE: - if(!msg->forwarded) - msg->from_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case SENDERNETADDR: - if(!msg->forwarded) - msg->from_net.addr=(char*)msg->hfield_dat[i]; - break; - case REPLYTO: - msg->replyto=(char*)msg->hfield_dat[i]; - break; - case REPLYTOEXT: - msg->replyto_ext=(char*)msg->hfield_dat[i]; - break; - case REPLYTOAGENT: - msg->replyto_agent=*(ushort *)msg->hfield_dat[i]; - break; - case REPLYTONETTYPE: - msg->replyto_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case REPLYTONETADDR: - msg->replyto_net.addr=(char*)msg->hfield_dat[i]; - break; - case RECIPIENT: - msg->to=(char*)msg->hfield_dat[i]; - break; - case RECIPIENTEXT: - msg->to_ext=(char*)msg->hfield_dat[i]; - break; - case RECIPIENTAGENT: - msg->to_agent=*(ushort *)msg->hfield_dat[i]; - break; - case RECIPIENTNETTYPE: - msg->to_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case RECIPIENTNETADDR: - msg->to_net.addr=(char*)msg->hfield_dat[i]; - break; - case SUBJECT: - msg->subj=(char*)msg->hfield_dat[i]; - break; - case SMB_SUMMARY: - msg->summary=(char*)msg->hfield_dat[i]; - break; - case SMB_EXPIRATION: - msg->expiration=*(time_t*)msg->hfield_dat[i]; - break; - case SMB_PRIORITY: - msg->priority=*(ulong*)msg->hfield_dat[i]; - break; - case SMB_COST: - msg->cost=*(ulong*)msg->hfield_dat[i]; - break; - case RFC822MSGID: - msg->id=(char*)msg->hfield_dat[i]; - break; - case RFC822REPLYID: - msg->reply_id=(char*)msg->hfield_dat[i]; - break; - case SMTPREVERSEPATH: - msg->reverse_path=(char*)msg->hfield_dat[i]; - break; - case USENETPATH: - msg->path=(char*)msg->hfield_dat[i]; - break; - case USENETNEWSGROUPS: - msg->newsgroups=(char*)msg->hfield_dat[i]; - break; - case FIDOMSGID: - msg->ftn_msgid=(char*)msg->hfield_dat[i]; - break; - case FIDOREPLYID: - msg->ftn_reply=(char*)msg->hfield_dat[i]; - break; - case FIDOAREA: - msg->ftn_area=(char*)msg->hfield_dat[i]; - break; - case FIDOPID: - msg->ftn_pid=(char*)msg->hfield_dat[i]; - break; - case FIDOTID: - msg->ftn_tid=(char*)msg->hfield_dat[i]; - break; - case FIDOFLAGS: - msg->ftn_flags=(char*)msg->hfield_dat[i]; - break; - - } + set_convenience_ptr(msg,msg->hfield[i].type,msg->hfield_dat[i]); + l+=msg->hfield[i].length; } @@ -963,9 +968,11 @@ int SMBCALL smb_hfield(smbmsg_t* msg, ushort type, size_t length, void* data) msg->hfield[i].type=type; msg->hfield[i].length=length; if(length) { - if((msg->hfield_dat[i]=(void* )MALLOC(length))==NULL) - return(4); + if((msg->hfield_dat[i]=(void* )MALLOC(length+1))==NULL) + return(4); /* Allocate 1 extra for ASCIIZ terminator */ + memset(msg->hfield_dat[i],0,length+1); memcpy(msg->hfield_dat[i],data,length); + set_convenience_ptr(msg,type,msg->hfield_dat[i]); } else msg->hfield_dat[i]=NULL;