Use a read lock when iterating over a hashmap

The 'dns_tsigkeyring_t' structure has a read/write lock to protect
its 'keys' member, which is a 'isc_hashmap_t' pointer and needs to
be protected.

The dns_tsigkeyring_dump() function, however, doesn't use the lock,
which can introduce a race with another thread, if the other thread
tries to modify the hashmap.

Add a read lock around the code, which iterates over the hashmap.
This commit is contained in:
Aram Sargsyan
2023-11-07 10:02:57 +00:00
parent 4c9d948365
commit 6687de854f

View File

@@ -469,6 +469,7 @@ dns_tsigkeyring_dump(dns_tsigkeyring_t *ring, FILE *fp) {
REQUIRE(VALID_TSIGKEYRING(ring));
RWLOCK(&ring->lock, isc_rwlocktype_read);
isc_hashmap_iter_create(ring->keys, &it);
for (result = isc_hashmap_iter_first(it); result == ISC_R_SUCCESS;
result = isc_hashmap_iter_next(it))
@@ -482,6 +483,7 @@ dns_tsigkeyring_dump(dns_tsigkeyring_t *ring, FILE *fp) {
}
}
isc_hashmap_iter_destroy(&it);
RWUNLOCK(&ring->lock, isc_rwlocktype_read);
return (found ? ISC_R_SUCCESS : ISC_R_NOTFOUND);
}