2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 06:25:31 +00:00

Add assertion failure when adding to hashmap when iterating

When iterating the table, we can't add new nodes to the hashmap because
we can't assure that we are not adding the new node before the iterator.

This also applies to rehashing - which might be triggered by both
isc_hashmap_add() and isc_hashmap_delete(), but not
isc_hashmap_iter_delcurrent_next().
This commit is contained in:
Ondřej Surý
2023-09-16 08:32:54 +02:00
parent 92a0d65a51
commit 45fb84076d

View File

@@ -87,6 +87,7 @@ struct isc_hashmap {
isc_mem_t *mctx;
size_t count;
hashmap_table_t tables[HASHMAP_NUM_TABLES];
uint_fast32_t iterators;
};
struct isc_hashmap_iter {
@@ -350,6 +351,9 @@ hashmap_rehash_one(isc_hashmap_t *hashmap) {
hashmap_node_t *oldtable = hashmap->tables[oldidx].table;
hashmap_node_t node;
/* Don't rehash when iterating */
INSIST(hashmap->iterators == 0);
/* Find first non-empty node */
while (hashmap->hiter < oldsize && oldtable[hashmap->hiter].key == NULL)
{
@@ -502,6 +506,8 @@ hashmap_add(isc_hashmap_t *hashmap, const uint32_t hashval,
hashmap_node_t *current = NULL;
uint32_t pos;
INSIST(hashmap->iterators == 0);
hash = isc_hash_bits32(hashval, hashmap->tables[idx].hashbits);
/* Initialize the node to be store to 'node' */
@@ -599,6 +605,8 @@ isc_hashmap_iter_create(isc_hashmap_t *hashmap, isc_hashmap_iter_t **iterp) {
.hindex = hashmap->hindex,
};
hashmap->iterators++;
*iterp = iter;
}
@@ -613,6 +621,9 @@ isc_hashmap_iter_destroy(isc_hashmap_iter_t **iterp) {
*iterp = NULL;
hashmap = iter->hashmap;
isc_mem_put(hashmap->mctx, iter, sizeof(*iter));
INSIST(hashmap->iterators > 0);
hashmap->iterators--;
}
static isc_result_t