From: Ondřej Surý Date: Sat, 16 Sep 2023 06:32:54 +0000 (+0200) Subject: Add assertion failure when adding to hashmap when iterating X-Git-Tag: v9.19.18~81^2~1 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=45fb84076dff6144e00e47baa3bbeeec79e7c466;p=thirdparty%2Fbind9.git 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(). --- diff --git a/lib/isc/hashmap.c b/lib/isc/hashmap.c index a8e635a9695..1fa5460770d 100644 --- a/lib/isc/hashmap.c +++ b/lib/isc/hashmap.c @@ -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