changeset 8150:7b5120f7f732 HEAD

hash2_remove_iter() was broken when it resized the hash table.
author Timo Sirainen <tss@iki.fi>
date Mon, 01 Sep 2008 17:07:37 +0300
parents 17cec811c5fd
children 10a5483c0d02
files src/lib/hash2.c
diffstat 1 files changed, 8 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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;