store_nfs_file_handle(nfs_fhandle_data_t *nfs_fh)
{
guint32 fhlen;
+ guint32 *fhdata;
emem_tree_key_t fhkey[3];
nfs_fhandle_data_t *new_nfs_fh;
fhlen=nfs_fh->len/4;
+ /* align the file handle data */
+ fhdata=g_malloc(fhlen*4);
+ memcpy(fhdata, nfs_fh->fh, fhlen*4);
fhkey[0].length=1;
fhkey[0].key=&fhlen;
fhkey[1].length=fhlen;
- fhkey[1].key=(guint32 *)nfs_fh->fh;
+ fhkey[1].key=fhdata;
fhkey[2].length=0;
new_nfs_fh=se_tree_lookup32_array(nfs_file_handles, &fhkey[0]);
if(new_nfs_fh){
+ g_free(fhdata);
return new_nfs_fh;
}
fhkey[0].length=1;
fhkey[0].key=&fhlen;
fhkey[1].length=fhlen;
- fhkey[1].key=(guint32 *)nfs_fh->fh;
+ fhkey[1].key=fhdata;
fhkey[2].length=0;
se_tree_insert32_array(nfs_file_handles, &fhkey[0], new_nfs_fh);
+ g_free(fhdata);
return new_nfs_fh;
}
nns=g_hash_table_lookup(nfs_name_snoop_matched, &key);
if(nns){
guint32 fhlen;
+ guint32 *fhdata;
emem_tree_key_t fhkey[3];
fhlen=nns->fh_length;
+ /* align it */
+ fhdata=g_malloc(fhlen);
+ memcpy(fhdata, nns->fh, fhlen);
fhkey[0].length=1;
fhkey[0].key=&fhlen;
fhkey[1].length=fhlen/4;
- fhkey[1].key=(guint32 *)nns->fh;
+ fhkey[1].key=fhdata;
fhkey[2].length=0;
se_tree_insert32_array(nfs_name_snoop_known, &fhkey[0], nns);
+ g_free(fhdata);
if(nfs_file_name_full_snooping){
unsigned char *name=NULL, *pos=NULL;
/* see if we know this mapping */
if(!nns){
guint32 fhlen;
+ guint32 *fhdata;
emem_tree_key_t fhkey[3];
fhlen=fh_length;
+ /* align it */
+ fhdata=tvb_memdup(tvb, fh_offset, fh_length);
fhkey[0].length=1;
fhkey[0].key=&fhlen;
fhkey[1].length=fhlen/4;
- fhkey[1].key=(guint32 *)tvb_get_ptr(tvb, fh_offset, fh_length);
+ fhkey[1].key=fhdata;
fhkey[2].length=0;
nns=se_tree_lookup32_array(nfs_name_snoop_known, &fhkey[0]);
+ g_free(fhdata);
}
/* if we know the mapping, print the filename */
emem_tree_insert_string(emem_tree_t* se_tree, const gchar* k, void* v) {
guint32 len = strlen(k);
guint32 div = (len-1)/4;
+ guint32 *aligned;
guint32 residual = 0;
- emem_tree_key_t key[] = {
- {1,NULL},
- {0,NULL},
- {1,NULL},
- {0,NULL}
- };
+ emem_tree_key_t key[4];
- key[0].key = &len;
- key[1].length = div;
- key[1].key = (guint32*)(&k[0]);
- key[2].key = &residual;
+ aligned = malloc(div * sizeof (guint32));
+ if (aligned == NULL)
+ return; /* XXX - fail somehow? */
+ memcpy(aligned, k, div * sizeof (guint32));
+ key[0].length = 1;
+ key[0].key = &len;
if (! div) {
- key[1].length = key[2].length;
- key[1].key = key[2].key;
+ key[1].length = 1;
+ key[1].key = &residual;
key[2].length = 0;
key[2].key = NULL;
+ } else {
+ key[1].length = div;
+ key[1].key = aligned;
+ key[2].length = 1;
+ key[2].key = &residual;
+ key[3].length = 0;
+ key[3].key = NULL;
}
div *= 4;
}
emem_tree_insert32_array(se_tree,key,v);
+ free(aligned);
}
void *
emem_tree_lookup_string(emem_tree_t* se_tree, const gchar* k) {
guint32 len = strlen(k);
guint32 div = (len-1)/4;
+ guint32 *aligned;
guint32 residual = 0;
- emem_tree_key_t key[] = {
- {1,NULL},
- {0,NULL},
- {1,NULL},
- {0,NULL}
- };
+ emem_tree_key_t key[4];
+ void *ret;
- key[0].key = &len;
- key[1].length = div;
- key[1].key = (guint32*)(&k[0]);
- key[2].key = &residual;
+ aligned = malloc(div * sizeof (guint32));
+ if (aligned == NULL)
+ return; /* XXX - fail somehow? */
+ memcpy(aligned, k, div * sizeof (guint32));
+ key[0].length = 1;
+ key[0].key = &len;
if (! div) {
- key[1].length = key[2].length;
- key[1].key = key[2].key;
+ key[1].length = 1;
+ key[1].key = &residual;
key[2].length = 0;
key[2].key = NULL;
+ } else {
+ key[1].length = div;
+ key[1].key = aligned;
+ key[2].length = 1;
+ key[2].key = &residual;
+ key[3].length = 0;
+ key[3].key = NULL;
}
div *= 4;
break;
}
- return emem_tree_lookup32_array(se_tree, key);
+ ret = emem_tree_lookup32_array(se_tree, key);
+ free(aligned);
+ return ret;
}
* The data pointer should be allocated by SE allocators so that the
* data will be released at the same time as the tree itself is destroyed.
*
+ * Note: all the "key" members of the "key" argument MUST be aligned on
+ * 32-bit boundaries; otherwise, this code will crash on platforms such
+ * as SPARC that require aligned pointers.
+ *
* If you use ...32_array() calls you MUST make sure that every single node
* you add to a specific tree always has a key of exactly the same number of
* keylen words or things will most likely crash. Or at least that every single