#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/random.h>
struct controlconnection {
isc_socket_t * sock;
isccc_ccmsg_t ccmsg;
- bool ccmsg_valid;
- bool sending;
+ bool ccmsg_valid;
+ bool sending;
isc_timer_t * timer;
isc_buffer_t * buffer;
controllistener_t * listener;
isc_sockaddr_t address;
isc_socket_t * sock;
dns_acl_t * acl;
- bool listening;
- bool exiting;
+ bool listening;
+ bool exiting;
controlkeylist_t keys;
controlconnectionlist_t connections;
isc_sockettype_t type;
uint32_t perm;
uint32_t owner;
uint32_t group;
- bool readonly;
+ bool readonly;
ISC_LINK(controllistener_t) link;
};
struct ns_controls {
ns_server_t *server;
controllistenerlist_t listeners;
- bool shuttingdown;
+ bool shuttingdown;
+ isc_mutex_t symtab_lock;
isccc_symtab_t *symtab;
};
/*
* Duplicate suppression (required for UDP).
*/
+ LOCK(&listener->controls->symtab_lock);
isccc_cc_cleansymtab(listener->controls->symtab, now);
result = isccc_cc_checkdup(listener->controls->symtab, request, now);
+ UNLOCK(&listener->controls->symtab_lock);
if (result != ISC_R_SUCCESS) {
if (result == ISC_R_EXISTS)
result = ISCCC_R_DUPLICATE;
isc_result_t result;
ns_controls_t *controls = isc_mem_get(mctx, sizeof(*controls));
- if (controls == NULL)
+ if (controls == NULL) {
return (ISC_R_NOMEMORY);
- controls->server = server;
+ }
+
+ *controls = (ns_controls_t){
+ .server = server,
+ };
+
ISC_LIST_INIT(controls->listeners);
- controls->shuttingdown = false;
- controls->symtab = NULL;
+
+ result = isc_mutex_init(&controls->symtab_lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(server->mctx, controls, sizeof(*controls));
+ return (result);
+ }
+
+ 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);
}
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));
*ctrlsp = NULL;
}