/* Returns NULL on failure */ hash_t** SMBCALL smb_msghashes(smbmsg_t* msg, const uchar* body) { size_t h=0; uchar flags=SMB_HASH_CRC16|SMB_HASH_CRC32|SMB_HASH_MD5; hash_t** hashes; /* This is a NULL-terminated list of hashes */ hash_t* hash; time_t t=time(NULL); if((hashes=(hash_t**)malloc(sizeof(hash_t*)*(SMB_HASH_SOURCE_TYPES+1)))==NULL) return(NULL); memset(hashes, 0, sizeof(hash_t*)*(SMB_HASH_SOURCE_TYPES+1)); if(msg->id!=NULL && (hash=smb_hashstr(msg->hdr.number, t, SMB_HASH_SOURCE_MSG_ID, flags, msg->id))!=NULL) hashes[h++]=hash; if(msg->ftn_msgid!=NULL && (hash=smb_hashstr(msg->hdr.number, t, SMB_HASH_SOURCE_FTN_ID, flags, msg->ftn_msgid))!=NULL) hashes[h++]=hash; flags|=SMB_HASH_STRIP_WSP; if(body!=NULL && (hash=smb_hashstr(msg->hdr.number, t, SMB_HASH_SOURCE_BODY, flags, body))!=NULL) hashes[h++]=hash; return(hashes); }
/* length=0 specifies ASCIIZ data */ int SMBCALL smb_getmsgidx_by_hash(smb_t* smb, smbmsg_t* msg, unsigned source ,unsigned flags, const void* data, size_t length) { int retval; size_t n; hash_t** hashes; hash_t found; if((hashes=(hash_t**)malloc(sizeof(hash_t*)*2))==NULL) return(SMB_ERR_MEM); if(length==0) hashes[0]=smb_hashstr(0,0,source,flags,data); else hashes[0]=smb_hash(0,0,source,flags,data,length); if(hashes[0]==NULL) return(SMB_ERR_MEM); hashes[1]=NULL; /* terminate list */ if((retval=smb_findhash(smb, hashes, &found, 1<<source, FALSE))==SMB_SUCCESS) { if(found.number==0) retval=SMB_FAILURE; /* use better error value here? */ else { msg->hdr.number=found.number; retval=smb_getmsgidx(smb, msg); } } FREE_LIST(hashes,n); return(retval); }
/* Returns NULL on failure */ hash_t** SMBCALL smb_msghashes(smbmsg_t* msg, const uchar* body, long source_mask) { size_t h=0; uchar flags=SMB_HASH_CRC16|SMB_HASH_CRC32|SMB_HASH_MD5; hash_t** hashes; /* This is a NULL-terminated list of hashes */ hash_t* hash; time_t t=time(NULL); if((hashes=(hash_t**)malloc(sizeof(hash_t*)*(SMB_HASH_SOURCE_TYPES+1)))==NULL) return(NULL); memset(hashes, 0, sizeof(hash_t*)*(SMB_HASH_SOURCE_TYPES+1)); if(msg->id!=NULL && (source_mask&(1<<SMB_HASH_SOURCE_MSG_ID)) && (hash=smb_hashstr(msg->hdr.number, (uint32_t)t, SMB_HASH_SOURCE_MSG_ID, flags, msg->id))!=NULL) hashes[h++]=hash; if(msg->ftn_msgid!=NULL && (source_mask&(1<<SMB_HASH_SOURCE_FTN_ID)) && (hash=smb_hashstr(msg->hdr.number, (uint32_t)t, SMB_HASH_SOURCE_FTN_ID, flags, msg->ftn_msgid))!=NULL) hashes[h++]=hash; if(body!=NULL && (source_mask&(1<<SMB_HASH_SOURCE_BODY)) && (hash=smb_hashstr(msg->hdr.number, (uint32_t)t, SMB_HASH_SOURCE_BODY, flags|SMB_HASH_STRIP_WSP|SMB_HASH_STRIP_CTRL_A, (const char *)body))!=NULL) hashes[h++]=hash; if(msg->subj!=NULL && (source_mask&(1<<SMB_HASH_SOURCE_SUBJECT))) { char* p=msg->subj; while(*p) { char* tp=strchr(p,':'); char* sp=strchr(p,' '); if(tp!=NULL && (sp==NULL || tp<sp)) { p=tp+1; SKIP_WHITESPACE(p); continue; } break; } if((hash=smb_hashstr(msg->hdr.number, (uint32_t)t, SMB_HASH_SOURCE_SUBJECT, flags, p))!=NULL) hashes[h++]=hash; } return(hashes); }