Mercurial > dovecot > original-hg > dovecot-1.2
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;