Make sure that the code doesn't try to use an illegal key.
authorWayne Davison <wayned@samba.org>
Sat, 26 Jun 2010 18:32:14 +0000 (11:32 -0700)
committerWayne Davison <wayned@samba.org>
Sat, 26 Jun 2010 18:32:14 +0000 (11:32 -0700)
hashtable.c

index ed29ee917a57746c9124dab850f16c57e3e4cc90..0524e24b5fa5a72afc8628253a36e8c8d0da49da 100644 (file)
@@ -41,7 +41,7 @@ struct hashtable *hashtable_create(int size, int key64)
        tbl->size = size;
        tbl->entries = 0;
        tbl->node_size = node_size;
-       tbl->key64 = key64;
+       tbl->key64 = key64 ? 1 : 0;
 
        return tbl;
 }
@@ -60,6 +60,11 @@ void *hashtable_find(struct hashtable *tbl, int64 key, int allocate_if_missing)
        struct ht_int32_node *node;
        uint32 ndx;
 
+       if (key64 ? key == 0 : (int32)key == 0) {
+               rprintf(FERROR, "Internal hashtable error: illegal key supplied!\n");
+               exit_cleanup(RERR_MESSAGEIO);
+       }
+
        if (allocate_if_missing && tbl->entries > HASH_LOAD_LIMIT(tbl->size)) {
                void *old_nodes = tbl->nodes;
                int size = tbl->size * 2;
@@ -142,7 +147,7 @@ void *hashtable_find(struct hashtable *tbl, int64 key, int allocate_if_missing)
        if (key64)
                ((struct ht_int64_node*)node)->key = key;
        else
-               node->key = key;
+               node->key = (int32)key;
        tbl->entries++;
        return node;
 }