aboutsummaryrefslogtreecommitdiffstats
path: root/epan/emem.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2007-04-28 21:09:20 +0000
committerGuy Harris <guy@alum.mit.edu>2007-04-28 21:09:20 +0000
commitb98d651b21aa7b469211b268e7daff22f5a892f8 (patch)
tree337e2634a017fb7bd7852398ed5bccd8c2e89e01 /epan/emem.c
parentb19c9f63e9f951af112fc35780fcd58d41cc4a17 (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.c64
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;
}