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.
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))
}
}
isc_hashmap_iter_destroy(&it);
+ RWUNLOCK(&ring->lock, isc_rwlocktype_read);
return (found ? ISC_R_SUCCESS : ISC_R_NOTFOUND);
}