diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index 63f6c4d57894d8b5d3da617445861931553b53c1..8b42c5e2970dbb7134bce9ab6192026a286eb710 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -2459,17 +2459,37 @@ static char* strip_chars(uchar* str, uchar* set) /* Allocates and calculates hashes of data (based on flags) */ /* Returns NULL on failure */ -hash_t* SMBCALL smb_hash(ulong msgnum, ulong t, unsigned source, unsigned flags, uchar* data) +hash_t* SMBCALL smb_hash(ulong msgnum, ulong t, unsigned source, unsigned flags, uchar* data + ,size_t length) { - uchar* p=data; - size_t len; hash_t* hash; if((hash=(hash_t*)malloc(sizeof(hash_t)))==NULL) return(NULL); - if(flags&~SMB_HASH_MASK) { /* pre-processing */ - if((p=strdup(data))==NULL) + hash->number=msgnum; + hash->time=t; + hash->source=source; + hash->flags=flags; + if(flags&SMB_HASH_CRC16) + hash->crc16=crc16(data,length); + if(flags&SMB_HASH_CRC32) + hash->crc32=crc32(data,length); + if(flags&SMB_HASH_MD5) + MD5_calc(hash->md5,data,length); + + return(hash); +} + +/* Allocates and calculates hashes of data (based on flags) */ +/* Returns NULL on failure */ +hash_t* SMBCALL smb_hashstr(ulong msgnum, ulong t, unsigned source, unsigned flags, uchar* str) +{ + uchar* p=str; + hash_t* hash; + + if(flags&~SMB_HASH_MASK) { /* string pre-processing */ + if((p=strdup(str))==NULL) return(NULL); if(flags&SMB_HASH_UPPERCASE) strupr(p); @@ -2478,24 +2498,16 @@ hash_t* SMBCALL smb_hash(ulong msgnum, ulong t, unsigned source, unsigned flags, if(flags&SMB_HASH_STRIP_WSP) strip_chars(p," \t\r\n"); } - len=strlen(p); - hash->number=msgnum; - hash->time=t; - hash->source=source; - hash->flags=flags; - if(flags&SMB_HASH_CRC16) - hash->crc16=crc16(p,len); - if(flags&SMB_HASH_CRC32) - hash->crc32=crc32(p,len); - if(flags&SMB_HASH_MD5) - MD5_calc(hash->md5,p,len); + + hash=smb_hash(msgnum, t, source, flags, p, strlen(p)); - if(p!=data) /* duped string */ + if(p!=str) /* duped string */ free(p); return(hash); } + /* Allocatese and calculates all hashes for a single message */ /* Returns NULL on failure */ hash_t** SMBCALL smb_msghashes(smb_t* smb, smbmsg_t* msg, uchar* text) @@ -2514,15 +2526,15 @@ hash_t** SMBCALL smb_msghashes(smb_t* smb, smbmsg_t* msg, uchar* text) memset(hashes, 0, sizeof(hash_t*)*SMB_MAX_HASH_COUNT); if(msg->id!=NULL - && (hash=smb_hash(msg->hdr.number, t, RFC822MSGID, flags, msg->id))!=NULL) + && (hash=smb_hashstr(msg->hdr.number, t, RFC822MSGID, flags, msg->id))!=NULL) hashes[h++]=hash; if(msg->ftn_msgid!=NULL - && (hash=smb_hash(msg->hdr.number, t, FIDOMSGID, flags, msg->ftn_msgid))!=NULL) + && (hash=smb_hashstr(msg->hdr.number, t, FIDOMSGID, flags, msg->ftn_msgid))!=NULL) hashes[h++]=hash; if(text!=NULL - && (hash=smb_hash(msg->hdr.number, t, TEXT_BODY, flags|SMB_HASH_STRIP_WSP, text))!=NULL) + && (hash=smb_hashstr(msg->hdr.number, t, TEXT_BODY, flags|SMB_HASH_STRIP_WSP, text))!=NULL) hashes[h++]=hash; return(hashes); diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h index a8ffa6618cb77965caafa0ef881368206d25c5ea..c70bbbd72cbf983bd8f864515b7ced41aa48118a 100644 --- a/src/smblib/smblib.h +++ b/src/smblib/smblib.h @@ -164,7 +164,8 @@ SMBEXPORT int SMBCALL smb_updatethread(smb_t* smb, smbmsg_t* remsg, ulong newms /* hash-related functions */ SMBEXPORT int SMBCALL smb_findhash(smb_t* smb, hash_t** compare_list, hash_t* found); SMBEXPORT int SMBCALL smb_hashmsg(smb_t* smb, smbmsg_t* msg, uchar* text); -SMBEXPORT hash_t* SMBCALL smb_hash(ulong msgnum, ulong time, unsigned source, unsigned flags, uchar* str); +SMBEXPORT hash_t* SMBCALL smb_hash(ulong msgnum, ulong time, unsigned source, unsigned flags, uchar* data, size_t length); +SMBEXPORT hash_t* SMBCALL smb_hashstr(ulong msgnum, ulong time, unsigned source, unsigned flags, uchar* str); SMBEXPORT hash_t** SMBCALL smb_msghashes(smb_t* smb, smbmsg_t* msg, uchar* text); SMBEXPORT int SMBCALL smb_addhashes(smb_t* smb, hash_t** hash_list);