diff options
author | Guy Harris <guy@alum.mit.edu> | 2007-04-28 21:09:20 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2007-04-28 21:09:20 +0000 |
commit | b98d651b21aa7b469211b268e7daff22f5a892f8 (patch) | |
tree | 337e2634a017fb7bd7852398ed5bccd8c2e89e01 /epan/emem.c | |
parent | b19c9f63e9f951af112fc35780fcd58d41cc4a17 (diff) |
In calls to the emem_tree routines, forcibly align items not known to be
aligned on 32-bit boundaries.
svn path=/trunk/; revision=21611
Diffstat (limited to 'epan/emem.c')
-rw-r--r-- | epan/emem.c | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/epan/emem.c b/epan/emem.c index 5b66e90c38..bae87b0cfd 100644 --- a/epan/emem.c +++ b/epan/emem.c @@ -1431,24 +1431,29 @@ void 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; @@ -1466,30 +1471,37 @@ emem_tree_insert_string(emem_tree_t* se_tree, const gchar* k, void* v) { } 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; @@ -1506,7 +1518,9 @@ emem_tree_lookup_string(emem_tree_t* se_tree, const gchar* k) { break; } - return emem_tree_lookup32_array(se_tree, key); + ret = emem_tree_lookup32_array(se_tree, key); + free(aligned); + return ret; } |