# HG changeset patch # User Timo Sirainen # Date 1220278057 -10800 # Node ID 7b5120f7f732cc069c7b9082e9202daa5d36080a # Parent 17cec811c5fd9e04134f254ae952d733f327533e hash2_remove_iter() was broken when it resized the hash table. diff -r 17cec811c5fd -r 7b5120f7f732 src/lib/hash2.c --- a/src/lib/hash2.c Mon Sep 01 16:10:27 2008 +0300 +++ b/src/lib/hash2.c Mon Sep 01 17:07:37 2008 +0300 @@ -186,13 +186,13 @@ static void hash2_remove_value_p(struct hash2_table *hash, struct hash2_value **valuep) { - struct hash2_value *value; + struct hash2_value *deleted_value; - value = *valuep; - *valuep = value->next; + deleted_value = *valuep; + *valuep = deleted_value->next; - value->next = hash->deleted_values; - hash->deleted_values = value; + deleted_value->next = hash->deleted_values; + hash->deleted_values = deleted_value; hash->count--; hash2_resize(hash, FALSE); @@ -218,14 +218,15 @@ void hash2_remove_iter(struct hash2_table *hash, struct hash2_iter *iter) { - struct hash2_value **valuep; + struct hash2_value **valuep, *next; valuep = array_idx_modifiable(&hash->hash_table, iter->key_hash % hash->hash_table_size); while (*valuep != NULL) { if (*valuep == iter->value) { + next = (*valuep)->next; hash2_remove_value_p(hash, valuep); - iter->next_value = *valuep; + iter->next_value = next; return; } valuep = &(*valuep)->next;