mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-03 13:59:27 -04:00
Merge branch '2131-tsan-data-race-in-accessing-controls-symtab' into 'main'
Resolve "TSAN data race in accessing controls->symtab" Closes #2131 See merge request isc-projects/bind9!4098
This commit is contained in:
commit
d83ddea5f6
1 changed files with 17 additions and 6 deletions
|
|
@ -19,6 +19,7 @@
|
|||
#include <isc/event.h>
|
||||
#include <isc/file.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/mutex.h>
|
||||
#include <isc/net.h>
|
||||
#include <isc/netaddr.h>
|
||||
#include <isc/netmgr.h>
|
||||
|
|
@ -109,6 +110,7 @@ struct named_controls {
|
|||
named_server_t *server;
|
||||
controllistenerlist_t listeners;
|
||||
bool shuttingdown;
|
||||
isc_mutex_t symtab_lock;
|
||||
isccc_symtab_t *symtab;
|
||||
};
|
||||
|
||||
|
|
@ -497,9 +499,11 @@ control_recvmessage(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
|
|||
/*
|
||||
* Duplicate suppression (required for UDP).
|
||||
*/
|
||||
LOCK(&listener->controls->symtab_lock);
|
||||
isccc_cc_cleansymtab(listener->controls->symtab, conn->now);
|
||||
result = isccc_cc_checkdup(listener->controls->symtab, conn->request,
|
||||
conn->now);
|
||||
UNLOCK(&listener->controls->symtab_lock);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
if (result == ISC_R_EXISTS) {
|
||||
result = ISCCC_R_DUPLICATE;
|
||||
|
|
@ -1492,15 +1496,19 @@ named_controls_create(named_server_t *server, named_controls_t **ctrlsp) {
|
|||
isc_result_t result;
|
||||
named_controls_t *controls = isc_mem_get(mctx, sizeof(*controls));
|
||||
|
||||
if (controls == NULL) {
|
||||
return (ISC_R_NOMEMORY);
|
||||
}
|
||||
controls->server = server;
|
||||
*controls = (named_controls_t){
|
||||
.server = server,
|
||||
};
|
||||
|
||||
ISC_LIST_INIT(controls->listeners);
|
||||
controls->shuttingdown = false;
|
||||
controls->symtab = NULL;
|
||||
|
||||
isc_mutex_init(&controls->symtab_lock);
|
||||
LOCK(&controls->symtab_lock);
|
||||
result = isccc_cc_createsymtab(&controls->symtab);
|
||||
UNLOCK(&controls->symtab_lock);
|
||||
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_mutex_destroy(&controls->symtab_lock);
|
||||
isc_mem_put(server->mctx, controls, sizeof(*controls));
|
||||
return (result);
|
||||
}
|
||||
|
|
@ -1515,6 +1523,9 @@ named_controls_destroy(named_controls_t **ctrlsp) {
|
|||
|
||||
REQUIRE(ISC_LIST_EMPTY(controls->listeners));
|
||||
|
||||
LOCK(&controls->symtab_lock);
|
||||
isccc_symtab_destroy(&controls->symtab);
|
||||
UNLOCK(&controls->symtab_lock);
|
||||
isc_mutex_destroy(&controls->symtab_lock);
|
||||
isc_mem_put(controls->server->mctx, controls, sizeof(*controls));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue