/*%
* Locked by qid->lock if qid exists; otherwise, can be used without
* being locked.
+ *
* Memory footprint considerations: this is a simple implementation of
* available ports, i.e., an ordered array of the actual port numbers.
* This will require about 256KB of memory in the worst case (128KB for
isc_socket_t *socket;
dns_dispatch_t *disp;
isc_sockaddr_t host;
- in_port_t localport; /* XXX: should be removed later */
dispportentry_t *portentry;
dns_dispentry_t *resp;
isc_task_t *task;
isc_sockaddr_t local; /*%< local address */
in_port_t localport; /*%< local UDP port */
isc_sockaddr_t peer; /*%< peer address (TCP) */
- isc_dscp_t dscp; /*%< "listen-on" DSCP value */
unsigned int maxrequests; /*%< max requests */
isc_event_t *ctlevent;
isc_mutex_t lock; /*%< locks all below */
isc_sockettype_t socktype;
unsigned int attributes;
- unsigned int refcount; /*%< number of users */
+ isc_refcount_t refcount;
dns_dispatchevent_t *failsafe_ev; /*%< failsafe cancel event */
unsigned int shutting_down : 1, shutdown_out : 1, connected : 1,
tcpmsg_valid : 1, recv_pending : 1; /*%< is a recv() pending? *
static isc_result_t
open_socket(isc_socketmgr_t *mgr, const isc_sockaddr_t *local,
unsigned int options, isc_socket_t **sockp,
- isc_socket_t *dup_socket, bool duponly);
+ isc_socket_t *dup_socket);
static bool
portavailable(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
isc_sockaddr_t *sockaddrp);
*/
static dns_dispentry_t *
linear_first(dns_qid_t *qid) {
- dns_dispentry_t *ret;
+ dns_dispentry_t *ret = NULL;
unsigned int bucket;
bucket = 0;
*/
static dns_dispentry_t *
linear_next(dns_qid_t *qid, dns_dispentry_t *resp) {
- dns_dispentry_t *ret;
+ dns_dispentry_t *ret = NULL;
unsigned int bucket;
ret = ISC_LIST_NEXT(resp, link);
*/
static bool
destroy_disp_ok(dns_dispatch_t *disp) {
- if (disp->refcount != 0) {
+ if (isc_refcount_current(&disp->refcount) != 0) {
return (false);
}
*/
static void
destroy_disp(isc_task_t *task, isc_event_t *event) {
- dns_dispatch_t *disp;
- dns_dispatchmgr_t *mgr;
+ dns_dispatch_t *disp = NULL;
+ dns_dispatchmgr_t *mgr = NULL;
bool killmgr;
- dispsocket_t *dispsocket;
+ dispsocket_t *dispsocket = NULL;
int i;
INSIST(event->ev_type == DNS_EVENT_DISPATCHCONTROL);
*/
static dispportentry_t *
port_search(dns_dispatch_t *disp, in_port_t port) {
- dispportentry_t *portentry;
+ dispportentry_t *portentry = NULL;
REQUIRE(disp->port_table != NULL);
static dispportentry_t *
new_portentry(dns_dispatch_t *disp, in_port_t port) {
- dispportentry_t *portentry;
- dns_qid_t *qid;
+ dispportentry_t *portentry = NULL;
+ dns_qid_t *qid = NULL;
REQUIRE(disp->port_table != NULL);
static dispsocket_t *
socket_search(dns_qid_t *qid, const isc_sockaddr_t *dest, in_port_t port,
unsigned int bucket) {
- dispsocket_t *dispsock;
+ dispsocket_t *dispsock = NULL;
REQUIRE(VALID_QID(qid));
REQUIRE(bucket < qid->qid_nbuckets);
in_port_t port;
isc_sockaddr_t localaddr;
unsigned int bucket = 0;
- dispsocket_t *dispsock;
+ dispsocket_t *dispsock = NULL;
unsigned int nports;
- in_port_t *ports;
+ in_port_t *ports = NULL;
isc_socket_options_t bindoptions;
dispportentry_t *portentry = NULL;
- dns_qid_t *qid;
+ dns_qid_t *qid = NULL;
if (isc_sockaddr_pf(&disp->local) == AF_INET) {
- nports = disp->mgr->nv4ports;
- ports = disp->mgr->v4ports;
+ nports = mgr->nv4ports;
+ ports = mgr->v4ports;
} else {
- nports = disp->mgr->nv6ports;
- ports = disp->mgr->v6ports;
+ nports = mgr->nv6ports;
+ ports = mgr->v6ports;
}
if (nports == 0) {
return (ISC_R_ADDRNOTAVAIL);
dispsock = isc_mem_get(mgr->mctx, sizeof(*dispsock));
disp->nsockets++;
- dispsock->socket = NULL;
- dispsock->disp = disp;
- dispsock->resp = NULL;
- dispsock->portentry = NULL;
- dispsock->task = NULL;
+
+ *dispsock = (dispsocket_t){ .disp = disp };
isc_task_attach(disp->task[isc_random_uniform(disp->ntasks)],
&dispsock->task);
ISC_LINK_INIT(dispsock, link);
bindoptions |= ISC_SOCKET_REUSEADDRESS;
}
result = open_socket(sockmgr, &localaddr, bindoptions, &sock,
- NULL, false);
+ NULL);
if (result == ISC_R_SUCCESS) {
if (portentry == NULL) {
portentry = new_portentry(disp, port);
*/
static void
destroy_dispsocket(dns_dispatch_t *disp, dispsocket_t **dispsockp) {
- dispsocket_t *dispsock;
+ dispsocket_t *dispsock = NULL;
dns_qid_t *qid = DNS_QID(disp);
/*
static dns_dispentry_t *
entry_search(dns_qid_t *qid, const isc_sockaddr_t *dest, dns_messageid_t id,
in_port_t port, unsigned int bucket) {
- dns_dispentry_t *res;
+ dns_dispentry_t *res = NULL;
REQUIRE(VALID_QID(qid));
REQUIRE(bucket < qid->qid_nbuckets);
static inline isc_socketevent_t *
allocate_sevent(dns_dispatch_t *disp, isc_socket_t *sock, isc_eventtype_t type,
isc_taskaction_t action, const void *arg) {
- isc_socketevent_t *ev;
+ isc_socketevent_t *ev = NULL;
void *deconst_arg;
ev = isc_mem_get(disp->sepool, sizeof(*ev));
static inline dns_dispatchevent_t *
allocate_devent(dns_dispatch_t *disp) {
- dns_dispatchevent_t *ev;
+ dns_dispatchevent_t *ev = NULL;
ev = isc_mem_get(disp->mgr->mctx, sizeof(*ev));
isc_refcount_increment0(&disp->mgr->irefs);
ISC_EVENT_INIT(ev, sizeof(*ev), 0, NULL, 0, NULL, NULL, NULL, NULL,
NULL);
-
return (ev);
}
isc_buffer_t source;
unsigned int flags;
dns_dispentry_t *resp = NULL;
- dns_dispatchevent_t *rev;
+ dns_dispatchevent_t *rev = NULL;
unsigned int bucket;
bool killit;
bool queue_response;
- dns_dispatchmgr_t *mgr;
- dns_qid_t *qid;
+ dns_dispatchmgr_t *mgr = NULL;
+ dns_qid_t *qid = NULL;
isc_netaddr_t netaddr;
int match;
int result;
}
if ((disp->attributes & DNS_DISPATCHATTR_EXCLUSIVE) != 0) {
- if (dispsock != NULL) {
- resp = dispsock->resp;
- id = resp->id;
- if (ev->result != ISC_R_SUCCESS) {
- /*
- * This is most likely a network error on a
- * connected socket. It makes no sense to
- * check the address or parse the packet, but it
- * will help to return the error to the caller.
- */
- goto sendresponse;
- }
- } else {
+ if (dispsock == NULL) {
free_buffer(disp, ev->region.base, ev->region.length);
isc_event_free(&ev_in);
UNLOCK(&disp->lock);
return;
}
+
+ resp = dispsock->resp;
+ id = resp->id;
+ if (ev->result != ISC_R_SUCCESS) {
+ /*
+ * This is most likely a network error on a
+ * connected socket. It makes no sense to
+ * check the address or parse the packet, but it
+ * will help to return the error to the caller.
+ */
+ goto sendresponse;
+ }
} else if (ev->result != ISC_R_SUCCESS) {
free_buffer(disp, ev->region.base, ev->region.length);
sendresponse:
queue_response = resp->item_out;
rev = allocate_devent(resp->disp);
- if (rev == NULL) {
- free_buffer(disp, ev->region.base, ev->region.length);
- goto unlock;
- }
/*
* At this point, rev contains the event we want to fill in, and
dns_messageid_t id;
isc_result_t dres;
unsigned int flags;
- dns_dispentry_t *resp;
- dns_dispatchevent_t *rev;
+ dns_dispentry_t *resp = NULL;
+ dns_dispatchevent_t *rev = NULL;
unsigned int bucket;
bool killit;
bool queue_response;
- dns_qid_t *qid;
+ dns_qid_t *qid = NULL;
int level;
char buf[ISC_SOCKADDR_FORMATSIZE];
INSIST(disp->recv_pending != 0);
disp->recv_pending = 0;
- if (disp->refcount == 0) {
+ if (isc_refcount_current(&disp->refcount) == 0) {
/*
* This dispatcher is shutting down. Force cancellation.
*/
resp = entry_search(qid, &tcpmsg->address, id, disp->localport, bucket);
dispatch_log(disp, LVL(90), "search for response in bucket %d: %s",
bucket, (resp == NULL ? "not found" : "found"));
-
if (resp == NULL) {
goto unlock;
}
+
queue_response = resp->item_out;
rev = allocate_devent(disp);
- if (rev == NULL) {
- goto unlock;
- }
/*
* At this point, rev contains the event we want to fill in, and
startrecv(dns_dispatch_t *disp, dispsocket_t *dispsock) {
isc_result_t res;
isc_region_t region;
- isc_socket_t *sock;
+ isc_socket_t *sock = NULL;
if (disp->shutting_down == 1) {
return (ISC_R_SUCCESS);
isc_socketevent_t *sev = allocate_sevent(
disp, sock, ISC_SOCKEVENT_RECVDONE, udp_exrecv,
dispsock);
- if (sev == NULL) {
- free_buffer(disp, region.base, region.length);
- return (ISC_R_NOMEMORY);
- }
res = isc_socket_recv2(sock, ®ion, 1, dt, sev, 0);
if (res != ISC_R_SUCCESS) {
isc_socketevent_t *sev = allocate_sevent(
disp, sock, ISC_SOCKEVENT_RECVDONE, udp_shrecv,
disp);
- if (sev == NULL) {
- free_buffer(disp, region.base, region.length);
- return (ISC_R_NOMEMORY);
- }
res = isc_socket_recv2(sock, ®ion, 1, dt, sev, 0);
if (res != ISC_R_SUCCESS) {
*/
static void
destroy_mgr(dns_dispatchmgr_t **mgrp) {
- dns_dispatchmgr_t *mgr;
+ dns_dispatchmgr_t *mgr = NULL;
mgr = *mgrp;
*mgrp = NULL;
static isc_result_t
open_socket(isc_socketmgr_t *mgr, const isc_sockaddr_t *local,
unsigned int options, isc_socket_t **sockp,
- isc_socket_t *dup_socket, bool duponly) {
- isc_socket_t *sock;
+ isc_socket_t *dup_socket) {
+ isc_socket_t *sock = NULL;
isc_result_t result;
sock = *sockp;
if (result != ISC_R_SUCCESS) {
return (result);
}
- } else if (dup_socket != NULL &&
- (!isc_socket_hasreuseport() || duponly)) {
+ } else if (dup_socket != NULL && !isc_socket_hasreuseport()) {
result = isc_socket_dup(dup_socket, &sock);
if (result != ISC_R_SUCCESS) {
return (result);
void
dns_dispatchmgr_destroy(dns_dispatchmgr_t **mgrp) {
- dns_dispatchmgr_t *mgr;
+ dns_dispatchmgr_t *mgr = NULL;
bool killit;
REQUIRE(mgrp != NULL);
return (available);
}
-#define ATTRMATCH(_a1, _a2, _mask) (((_a1) & (_mask)) == ((_a2) & (_mask)))
-
static isc_result_t
qid_allocate(dns_dispatchmgr_t *mgr, unsigned int buckets,
unsigned int increment, dns_qid_t **qidp, bool needsocktable) {
- dns_qid_t *qid;
+ dns_qid_t *qid = NULL;
unsigned int i;
REQUIRE(VALID_DISPATCHMGR(mgr));
static void
qid_destroy(isc_mem_t *mctx, dns_qid_t **qidp) {
- dns_qid_t *qid;
+ dns_qid_t *qid = NULL;
REQUIRE(qidp != NULL);
qid = *qidp;
static isc_result_t
dispatch_allocate(dns_dispatchmgr_t *mgr, unsigned int maxrequests,
dns_dispatch_t **dispp) {
- dns_dispatch_t *disp;
- isc_result_t result;
+ dns_dispatch_t *disp = NULL;
REQUIRE(VALID_DISPATCHMGR(mgr));
REQUIRE(dispp != NULL && *dispp == NULL);
disp = isc_mem_get(mgr->mctx, sizeof(*disp));
isc_refcount_increment0(&mgr->irefs);
- disp->magic = 0;
- disp->mgr = mgr;
- disp->maxrequests = maxrequests;
- disp->attributes = 0;
+ *disp = (dns_dispatch_t){ .mgr = mgr,
+ .maxrequests = maxrequests,
+ .shutdown_why = ISC_R_UNEXPECTED };
+ isc_refcount_init(&disp->refcount, 1);
ISC_LINK_INIT(disp, link);
- disp->refcount = 1;
- disp->recv_pending = 0;
- memset(&disp->local, 0, sizeof(disp->local));
- memset(&disp->peer, 0, sizeof(disp->peer));
- disp->localport = 0;
- disp->shutting_down = 0;
- disp->shutdown_out = 0;
- disp->connected = 0;
- disp->tcpmsg_valid = 0;
- disp->shutdown_why = ISC_R_UNEXPECTED;
- disp->requests = 0;
- disp->tcpbuffers = 0;
- disp->qid = NULL;
ISC_LIST_INIT(disp->activesockets);
ISC_LIST_INIT(disp->inactivesockets);
- disp->nsockets = 0;
- disp->port_table = NULL;
- disp->dscp = -1;
isc_mutex_init(&disp->lock);
-
disp->failsafe_ev = allocate_devent(disp);
- if (disp->failsafe_ev == NULL) {
- result = ISC_R_NOMEMORY;
- goto kill_lock;
- }
-
disp->magic = DISPATCH_MAGIC;
*dispp = disp;
return (ISC_R_SUCCESS);
-
- /*
- * error returns
- */
-kill_lock:
- isc_mutex_destroy(&disp->lock);
- isc_refcount_decrement(&mgr->irefs);
- isc_mem_put(mgr->mctx, disp, sizeof(*disp));
-
- return (result);
}
/*
*/
static void
dispatch_free(dns_dispatch_t **dispp) {
- dns_dispatch_t *disp;
- dns_dispatchmgr_t *mgr;
+ dns_dispatch_t *disp = NULL;
+ dns_dispatchmgr_t *mgr = NULL;
REQUIRE(VALID_DISPATCH(*dispp));
disp = *dispp;
unsigned int buckets, unsigned int increment,
unsigned int attributes, dns_dispatch_t **dispp) {
isc_result_t result;
- dns_dispatch_t *disp;
+ dns_dispatch_t *disp = NULL;
UNUSED(maxbuffers);
UNUSED(buffersize);
ISC_LIST_APPEND(mgr->list, disp, link);
UNLOCK(&mgr->lock);
- mgr_log(mgr, LVL(90), "created TCP dispatcher %p", disp);
- dispatch_log(disp, LVL(90), "created task %p", disp->task[0]);
+ if (isc_log_wouldlog(dns_lctx, 90)) {
+ mgr_log(mgr, LVL(90),
+ "dns_dispatch_createtcp: created TCP dispatch %p",
+ disp);
+ dispatch_log(disp, LVL(90), "created task %p", disp->task[0]);
+ }
*dispp = disp;
return (ISC_R_SUCCESS);
return (result);
}
+#define ATTRMATCH(_a1, _a2, _mask) (((_a1) & (_mask)) == ((_a2) & (_mask)))
+
isc_result_t
dns_dispatch_gettcp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *destaddr,
const isc_sockaddr_t *localaddr, bool *connected,
dns_dispatch_t **dispp) {
- dns_dispatch_t *disp;
+ dns_dispatch_t *disp = NULL;
isc_result_t result;
isc_sockaddr_t peeraddr;
isc_sockaddr_t sockname;
isc_sockaddr_eqaddr(localaddr, &sockname)))
{
/* attach */
- disp->refcount++;
+ isc_refcount_increment(&disp->refcount);
*dispp = disp;
match = true;
if (connected != NULL) {
isc_sockaddr_equal(destaddr, &disp->peer))
{
/* attach */
- disp->refcount++;
+ isc_refcount_increment(&disp->refcount);
*dispp = disp;
match = true;
}
}
/*
- * Nope, create one.
+ * We need an exclusive-socket dispatch, or else we didn't
+ * find a suitable shared one and need to create it.
*/
result = dispatch_createudp(mgr, sockmgr, taskmgr, localaddr,
maxrequests, attributes, &disp, NULL);
-
if (result != ISC_R_SUCCESS) {
UNLOCK(&mgr->lock);
return (result);
isc_sockaddr_t localaddr_bound;
isc_socket_t *sock = NULL;
isc_result_t result = ISC_R_SUCCESS;
- bool anyport;
+ unsigned int nports;
+ in_port_t *ports = NULL;
- INSIST(sockp != NULL && *sockp == NULL);
+ REQUIRE(sockp != NULL && *sockp == NULL);
- localaddr_bound = *localaddr;
- anyport = (isc_sockaddr_getport(localaddr) == 0);
+ if (isc_sockaddr_getport(localaddr) != 0) {
+ /* Allow to reuse address for non-random ports. */
+ result = open_socket(sockmgr, localaddr,
+ ISC_SOCKET_REUSEADDRESS, &sock,
+ dup_socket);
+ if (result == ISC_R_SUCCESS) {
+ *sockp = sock;
+ }
- if (anyport) {
- unsigned int nports;
- in_port_t *ports;
+ return (result);
+ }
- /*
- * If no port is specified, we first try to pick up a random
- * port by ourselves.
- */
- if (isc_sockaddr_pf(localaddr) == AF_INET) {
- nports = disp->mgr->nv4ports;
- ports = disp->mgr->v4ports;
- } else {
- nports = disp->mgr->nv6ports;
- ports = disp->mgr->v6ports;
- }
- if (nports == 0) {
- return (ISC_R_ADDRNOTAVAIL);
- }
+ /*
+ * If no port is specified, we first try to pick up a random
+ * port by ourselves.
+ */
+ if (isc_sockaddr_pf(localaddr) == AF_INET) {
+ nports = mgr->nv4ports;
+ ports = mgr->v4ports;
+ } else {
+ nports = mgr->nv6ports;
+ ports = mgr->v6ports;
+ }
+ if (nports == 0) {
+ return (ISC_R_ADDRNOTAVAIL);
+ }
- for (i = 0; i < 1024; i++) {
- in_port_t prt;
+ localaddr_bound = *localaddr;
- prt = ports[isc_random_uniform(nports)];
- isc_sockaddr_setport(&localaddr_bound, prt);
- result = open_socket(sockmgr, &localaddr_bound, 0,
- &sock, NULL, false);
- /*
- * Continue if the port chosen is already in use
- * or the OS has reserved it.
- */
- if (result == ISC_R_NOPERM || result == ISC_R_ADDRINUSE)
- {
- continue;
- }
- disp->localport = prt;
- *sockp = sock;
- return (result);
- }
+ for (i = 0; i < 1024; i++) {
+ in_port_t prt;
+ prt = ports[isc_random_uniform(nports)];
+ isc_sockaddr_setport(&localaddr_bound, prt);
+ result = open_socket(sockmgr, &localaddr_bound, 0, &sock, NULL);
/*
- * If this fails 1024 times, we then ask the kernel for
- * choosing one.
+ * If the port chosen is already in use or the OS has
+ * reserved it, try again.
*/
- } else {
- /* Allow to reuse address for non-random ports. */
- result = open_socket(sockmgr, localaddr,
- ISC_SOCKET_REUSEADDRESS, &sock, dup_socket,
- true);
-
- if (result == ISC_R_SUCCESS) {
- *sockp = sock;
+ if (result == ISC_R_NOPERM || result == ISC_R_ADDRINUSE) {
+ continue;
}
-
+ disp->localport = prt;
+ *sockp = sock;
return (result);
}
+ /*
+ * If this fails 1024 times, we then ask the kernel for
+ * help choosing one.
+ */
memset(held, 0, sizeof(held));
i = 0;
for (j = 0; j < 0xffffU; j++) {
- result = open_socket(sockmgr, localaddr, 0, &sock, NULL, false);
+ result = open_socket(sockmgr, localaddr, 0, &sock, NULL);
if (result != ISC_R_SUCCESS) {
goto end;
} else if (portavailable(mgr, sock, NULL)) {
i = 0;
}
}
+
if (j == 0xffffU) {
mgr_log(mgr, ISC_LOG_ERROR,
"avoid-v%s-udp-ports: unable to allocate "
unsigned int maxrequests, unsigned int attributes,
dns_dispatch_t **dispp, isc_socket_t *dup_socket) {
isc_result_t result;
- dns_dispatch_t *disp;
+ dns_dispatch_t *disp = NULL;
isc_socket_t *sock = NULL;
int i = 0;
isc_sockaddr_format(localaddr, addrbuf,
ISC_SOCKADDR_FORMATSIZE);
mgr_log(mgr, LVL(90),
- "dns_dispatch_createudp: Created"
- " UDP dispatch for %s with socket fd %d",
+ "dispatch_createudp: created shared "
+ "UDP dispatch for %s with socket fd %d",
addrbuf, isc_socket_getfd(sock));
}
} else {
*/
isc_sockaddr_anyofpf(&sa_any, isc_sockaddr_pf(localaddr));
if (!isc_sockaddr_eqaddr(&sa_any, localaddr)) {
- result = open_socket(sockmgr, localaddr, 0, &sock, NULL,
- false);
+ result = open_socket(sockmgr, localaddr, 0, &sock,
+ NULL);
if (sock != NULL) {
isc_socket_detach(&sock);
}
REQUIRE(VALID_DISPATCH(disp));
REQUIRE(dispp != NULL && *dispp == NULL);
- LOCK(&disp->lock);
- disp->refcount++;
- UNLOCK(&disp->lock);
-
+ isc_refcount_increment(&disp->refcount);
*dispp = disp;
}
*/
void
dns_dispatch_detach(dns_dispatch_t **dispp) {
- dns_dispatch_t *disp;
- dispsocket_t *dispsock;
+ dns_dispatch_t *disp = NULL;
+ dispsocket_t *dispsock = NULL;
bool killit;
REQUIRE(dispp != NULL && VALID_DISPATCH(*dispp));
*dispp = NULL;
LOCK(&disp->lock);
-
- INSIST(disp->refcount > 0);
- disp->refcount--;
- if (disp->refcount == 0) {
+ if (isc_refcount_decrement(&disp->refcount) == 1) {
if (disp->recv_pending > 0) {
isc_socket_cancel(disp->socket, disp->task[0],
ISC_SOCKCANCEL_RECV);
disp->shutting_down = 1;
}
- dispatch_log(disp, LVL(90), "detach: refcount %d", disp->refcount);
+ dispatch_log(disp, LVL(90), "detach: refcount %" PRIuFAST32,
+ isc_refcount_current(&disp->refcount));
killit = destroy_disp_ok(disp);
UNLOCK(&disp->lock);
isc_taskaction_t action, void *arg,
dns_messageid_t *idp, dns_dispentry_t **resp,
isc_socketmgr_t *sockmgr) {
- dns_dispentry_t *res;
+ dns_dispentry_t *res = NULL;
unsigned int bucket;
in_port_t localport = 0;
dns_messageid_t id;
- int i;
- bool ok;
- dns_qid_t *qid;
+ int i = 0;
+ bool ok = false;
+ dns_qid_t *qid = NULL;
dispsocket_t *dispsocket = NULL;
isc_result_t result;
if ((disp->attributes & DNS_DISPATCHATTR_EXCLUSIVE) != 0 &&
disp->nsockets > DNS_DISPATCH_SOCKSQUOTA)
{
- dispsocket_t *oldestsocket;
- dns_dispentry_t *oldestresp;
- dns_dispatchevent_t *rev;
+ dispsocket_t *oldestsocket = NULL;
+ dns_dispentry_t *oldestresp = NULL;
+ dns_dispatchevent_t *rev = NULL;
/*
* Kill oldest outstanding query if the number of sockets
oldestresp = oldestsocket->resp;
if (oldestresp != NULL && !oldestresp->item_out) {
rev = allocate_devent(oldestresp->disp);
- if (rev != NULL) {
- rev->buffer.base = NULL;
- rev->result = ISC_R_CANCELED;
- rev->id = oldestresp->id;
- ISC_EVENT_INIT(rev, sizeof(*rev), 0, NULL,
- DNS_EVENT_DISPATCH,
- oldestresp->action,
- oldestresp->arg, oldestresp,
- NULL, NULL);
- oldestresp->item_out = true;
- isc_task_send(oldestresp->task,
- ISC_EVENT_PTR(&rev));
- inc_stats(disp->mgr,
- dns_resstatscounter_dispabort);
- }
+ rev->buffer.base = NULL;
+ rev->result = ISC_R_CANCELED;
+ rev->id = oldestresp->id;
+ ISC_EVENT_INIT(rev, sizeof(*rev), 0, NULL,
+ DNS_EVENT_DISPATCH, oldestresp->action,
+ oldestresp->arg, oldestresp, NULL, NULL);
+ oldestresp->item_out = true;
+ isc_task_send(oldestresp->task, ISC_EVENT_PTR(&rev));
+ inc_stats(disp->mgr, dns_resstatscounter_dispabort);
}
/*
}
/*
- * Try somewhat hard to find a unique ID, unless
- * DNS_DISPATCHOPT_FIXEDID is set, in which case we
- * use the ID passed in via *idp.
+ * Try somewhat hard to find a unique ID. Start with
+ * a random number unless DNS_DISPATCHOPT_FIXEDID is set,
+ * in which case we start with the ID passed in via *idp.
*/
- LOCK(&qid->lock);
if ((options & DNS_DISPATCHOPT_FIXEDID) != 0) {
id = *idp;
} else {
id = (dns_messageid_t)isc_random16();
}
- ok = false;
- i = 0;
+
+ LOCK(&qid->lock);
do {
+ dns_dispentry_t *entry = NULL;
bucket = dns_hash(qid, dest, id, localport);
- if (entry_search(qid, dest, id, localport, bucket) == NULL) {
+ entry = entry_search(qid, dest, id, localport, bucket);
+ if (entry == NULL) {
ok = true;
break;
}
res = isc_mem_get(disp->mgr->mctx, sizeof(*res));
isc_refcount_increment0(&disp->mgr->irefs);
+ *res = (dns_dispentry_t){ .disp = disp,
+ .id = id,
+ .port = localport,
+ .bucket = bucket,
+ .host = *dest,
+ .action = action,
+ .arg = arg,
+ .dispsocket = dispsocket };
+ isc_task_attach(task, &res->task);
+ ISC_LIST_INIT(res->items);
+ ISC_LINK_INIT(res, link);
+ res->magic = RESPONSE_MAGIC;
- disp->refcount++;
+ isc_refcount_increment(&disp->refcount);
disp->requests++;
- res->task = NULL;
- isc_task_attach(task, &res->task);
- res->disp = disp;
- res->id = id;
- res->port = localport;
- res->bucket = bucket;
- res->host = *dest;
- res->action = action;
- res->arg = arg;
- res->dispsocket = dispsocket;
+
if (dispsocket != NULL) {
dispsocket->resp = res;
}
- res->item_out = false;
- ISC_LIST_INIT(res->items);
- ISC_LINK_INIT(res, link);
- res->magic = RESPONSE_MAGIC;
LOCK(&qid->lock);
ISC_LIST_APPEND(qid->qid_table[bucket], res, link);
destroy_dispsocket(disp, &dispsocket);
}
- disp->refcount--;
+ isc_refcount_decrement(&disp->refcount);
disp->requests--;
dec_stats(disp->mgr,
isc_result_t
dns_dispatch_getnext(dns_dispentry_t *resp, dns_dispatchevent_t **sockevent) {
- dns_dispatch_t *disp;
- dns_dispatchevent_t *ev;
+ dns_dispatch_t *disp = NULL;
+ dns_dispatchevent_t *ev = NULL;
REQUIRE(VALID_RESPONSE(resp));
REQUIRE(sockevent != NULL && *sockevent != NULL);
void
dns_dispatch_removeresponse(dns_dispentry_t **resp,
dns_dispatchevent_t **sockevent) {
- dns_dispatchmgr_t *mgr;
- dns_dispatch_t *disp;
- dns_dispentry_t *res;
- dispsocket_t *dispsock;
- dns_dispatchevent_t *ev;
+ dns_dispatchmgr_t *mgr = NULL;
+ dns_dispatch_t *disp = NULL;
+ dns_dispentry_t *res = NULL;
+ dispsocket_t *dispsock = NULL;
+ dns_dispatchevent_t *ev = NULL;
unsigned int bucket;
bool killit;
unsigned int n;
isc_eventlist_t events;
- dns_qid_t *qid;
+ dns_qid_t *qid = NULL;
REQUIRE(resp != NULL);
REQUIRE(VALID_RESPONSE(*resp));
dec_stats(disp->mgr, (qid == disp->mgr->qid)
? dns_resstatscounter_disprequdp
: dns_resstatscounter_dispreqtcp);
- INSIST(disp->refcount > 0);
- disp->refcount--;
- if (disp->refcount == 0) {
+
+ if (isc_refcount_decrement(&disp->refcount) == 1) {
if (disp->recv_pending > 0) {
isc_socket_cancel(disp->socket, disp->task[0],
ISC_SOCKCANCEL_RECV);
*/
static void
do_cancel(dns_dispatch_t *disp) {
- dns_dispatchevent_t *ev;
- dns_dispentry_t *resp;
- dns_qid_t *qid;
+ dns_dispatchevent_t *ev = NULL;
+ dns_dispentry_t *resp = NULL;
+ dns_qid_t *qid = NULL;
if (disp->shutdown_out == 1) {
return;
/* Exclusive attribute can only be set on creation */
REQUIRE((attributes & DNS_DISPATCHATTR_EXCLUSIVE) == 0);
- /* XXXMLG
- * Should check for valid attributes here!
- */
-
LOCK(&disp->lock);
disp->attributes &= ~mask;
dns_dispatch_t *
dns_dispatchset_get(dns_dispatchset_t *dset) {
- dns_dispatch_t *disp;
+ dns_dispatch_t *disp = NULL;
/* check that dispatch set is configured */
if (dset == NULL || dset->ndisp == 0) {
isc_taskmgr_t *taskmgr, dns_dispatch_t *source,
dns_dispatchset_t **dsetp, int n) {
isc_result_t result;
- dns_dispatchset_t *dset;
- dns_dispatchmgr_t *mgr;
+ dns_dispatchset_t *dset = NULL;
+ dns_dispatchmgr_t *mgr = NULL;
int i, j;
REQUIRE(VALID_DISPATCH(source));
mgr = source->mgr;
dset = isc_mem_get(mctx, sizeof(dns_dispatchset_t));
- memset(dset, 0, sizeof(*dset));
+ *dset = (dns_dispatchset_t){ .ndisp = n };
isc_mutex_init(&dset->lock);
dset->dispatches = isc_mem_get(mctx, sizeof(dns_dispatch_t *) * n);
isc_mem_attach(mctx, &dset->mctx);
- dset->ndisp = n;
- dset->cur = 0;
dset->dispatches[0] = NULL;
dns_dispatch_attach(source, &dset->dispatches[0]);
REQUIRE(dset != NULL);
for (i = 0; i < dset->ndisp; i++) {
- isc_socket_t *sock;
+ isc_socket_t *sock = NULL;
sock = dns_dispatch_getsocket(dset->dispatches[i]);
isc_socket_cancel(sock, task, ISC_SOCKCANCEL_ALL);
}
void
dns_dispatchset_destroy(dns_dispatchset_t **dsetp) {
- dns_dispatchset_t *dset;
+ dns_dispatchset_t *dset = NULL;
int i;
REQUIRE(dsetp != NULL && *dsetp != NULL);
uint32_t lame_ttl;
ISC_LIST(alternate_t) alternates;
uint16_t udpsize;
-#if USE_ALGLOCK
- isc_rwlock_t alglock;
-#endif /* if USE_ALGLOCK */
dns_rbt_t *algorithms;
dns_rbt_t *digests;
-#if USE_MBSLOCK
- isc_rwlock_t mbslock;
-#endif /* if USE_MBSLOCK */
dns_rbt_t *mustbesecure;
unsigned int spillatmax;
unsigned int spillatmin;
INSIST(ISC_LIST_EMPTY(fctx->validators));
query = isc_mem_get(fctx->mctx, sizeof(*query));
- query->rmessage = NULL;
- dns_message_create(fctx->mctx, DNS_MESSAGE_INTENTPARSE,
- &query->rmessage);
- query->mctx = fctx->mctx;
- query->options = options;
- query->attributes = 0;
- query->sends = 0;
- query->connects = 0;
- query->dscp = addrinfo->dscp;
- query->udpsize = 0;
+ *query = (resquery_t){ .mctx = fctx->mctx,
+ .options = options,
+ .dscp = addrinfo->dscp,
+ .addrinfo = addrinfo,
+ .dispatchmgr = res->dispatchmgr };
+
/*
* Note that the caller MUST guarantee that 'addrinfo' will remain
* valid until this query is canceled.
*/
- query->addrinfo = addrinfo;
+
+ dns_message_create(fctx->mctx, DNS_MESSAGE_INTENTPARSE,
+ &query->rmessage);
TIME_NOW(&query->start);
/*
* shared dispatch.
*/
query->dispatchmgr = res->dispatchmgr;
- query->dispatch = NULL;
- query->exclusivesocket = false;
- query->tcpsocket = NULL;
if (res->view->peers != NULL) {
dns_peer_t *peer = NULL;
isc_netaddr_t dstip;
goto cleanup_query;
}
-#ifndef BROKEN_TCP_BIND_BEFORE_CONNECT
result = isc_socket_bind(query->tcpsocket, &addr, 0);
if (result != ISC_R_SUCCESS) {
goto cleanup_socket;
}
-#endif /* ifndef BROKEN_TCP_BIND_BEFORE_CONNECT */
/*
* A dispatch will be created once the connect succeeds.
INSIST(query->dispatch != NULL);
}
- query->dispentry = NULL;
query->fctx = fctx; /* reference added by caller */
- query->tsig = NULL;
- query->tsigkey = NULL;
ISC_LINK_INIT(query, link);
query->magic = QUERY_MAGIC;
const isc_sockaddr_t *client, unsigned int options,
unsigned int bucketnum, unsigned int depth, isc_counter_t *qc,
fetchctx_t **fctxp) {
- fetchctx_t *fctx;
+ fetchctx_t *fctx = NULL;
isc_result_t result;
isc_result_t iresult;
isc_interval_t interval;
unsigned int findoptions = 0;
char buf[DNS_NAME_FORMATSIZE + DNS_RDATATYPE_FORMATSIZE + 1];
- isc_mem_t *mctx;
+ isc_mem_t *mctx = NULL;
size_t p;
bool try_stale;
mctx = res->buckets[bucketnum].mctx;
fctx = isc_mem_get(mctx, sizeof(*fctx));
+ *fctx = (fetchctx_t){
+ .res = res,
+ .type = type,
+ .qmintype = type,
+ .options = options,
+ .bucketnum = bucketnum,
+ .dbucketnum = RES_NOBUCKET,
+ .state = fetchstate_init,
+ .depth = depth,
+ .qmin_labels = 1,
+ .fwdpolicy = dns_fwdpolicy_none,
+ .result = ISC_R_FAILURE,
+ .exitline = -1 /* sentinel */
+ };
+
+ FCTXTRACE("create");
- fctx->qc = NULL;
if (qc != NULL) {
isc_counter_attach(qc, &fctx->qc);
} else {
dns_rdatatype_format(type, buf + p, sizeof(buf) - p);
fctx->info = isc_mem_strdup(mctx, buf);
- FCTXTRACE("create");
dns_name_init(&fctx->name, NULL);
dns_name_dup(name, mctx, &fctx->name);
dns_name_init(&fctx->qminname, NULL);
dns_name_init(&fctx->domain, NULL);
dns_rdataset_init(&fctx->nameservers);
- fctx->type = type;
- fctx->qmintype = type;
- fctx->options = options;
/*
* Note! We do not attach to the task. We are relying on the
* resolver to ensure that this task doesn't go away while we are
* using it.
*/
- fctx->res = res;
isc_refcount_init(&fctx->references, 0);
- fctx->bucketnum = bucketnum;
- fctx->dbucketnum = RES_NOBUCKET;
- fctx->state = fetchstate_init;
- fctx->want_shutdown = false;
- fctx->cloned = false;
- fctx->depth = depth;
- fctx->minimized = false;
- fctx->ip6arpaskip = false;
- fctx->forwarding = false;
- fctx->qmin_labels = 1;
- fctx->qmin_warning = ISC_R_SUCCESS;
- fctx->qminfetch = NULL;
dns_rdataset_init(&fctx->qminrrset);
dns_name_init(&fctx->qmindcname, NULL);
isc_stdtime_get(&fctx->now);
ISC_LIST_INIT(fctx->forwaddrs);
ISC_LIST_INIT(fctx->altaddrs);
ISC_LIST_INIT(fctx->forwarders);
- fctx->fwdpolicy = dns_fwdpolicy_none;
ISC_LIST_INIT(fctx->bad);
ISC_LIST_INIT(fctx->edns);
ISC_LIST_INIT(fctx->bad_edns);
ISC_LIST_INIT(fctx->validators);
- fctx->validator = NULL;
- fctx->find = NULL;
- fctx->altfind = NULL;
- fctx->pending = 0;
- fctx->restarts = 0;
- fctx->querysent = 0;
- fctx->referrals = 0;
TIME_NOW(&fctx->start);
- fctx->timeouts = 0;
- fctx->lamecount = 0;
- fctx->quotacount = 0;
- fctx->adberr = 0;
- fctx->neterr = 0;
- fctx->badresp = 0;
- fctx->findfail = 0;
- fctx->valfail = 0;
- fctx->result = ISC_R_FAILURE;
- fctx->vresult = ISC_R_SUCCESS;
- fctx->exitline = -1; /* sentinel */
- fctx->logged = false;
atomic_init(&fctx->attributes, 0);
- fctx->spilled = false;
- fctx->nqueries = 0;
- fctx->rand_buf = 0;
- fctx->rand_bits = 0;
- fctx->timeout = false;
- fctx->addrinfo = NULL;
+
if (client != NULL) {
isc_sockaddr_format(client, fctx->clientstr,
sizeof(fctx->clientstr));
} else {
strlcpy(fctx->clientstr, "<unknown>", sizeof(fctx->clientstr));
}
- fctx->ns_ttl = 0;
- fctx->ns_ttl_ok = false;
dns_name_init(&fctx->nsname, NULL);
- fctx->nsfetch = NULL;
dns_rdataset_init(&fctx->nsrrset);
if (domain == NULL) {
dns_resolver_reset_ds_digests(res);
dns_badcache_destroy(&res->badcache);
dns_resolver_resetmustbesecure(res);
-#if USE_ALGLOCK
- isc_rwlock_destroy(&res->alglock);
-#endif /* if USE_ALGLOCK */
-#if USE_MBSLOCK
- isc_rwlock_destroy(&res->mbslock);
-#endif /* if USE_MBSLOCK */
isc_timer_detach(&res->spillattimer);
res->magic = 0;
isc_mem_put(res->mctx, res, sizeof(*res));
unsigned int options, dns_dispatchmgr_t *dispatchmgr,
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
dns_resolver_t **resp) {
- dns_resolver_t *res;
+ dns_resolver_t *res = NULL;
isc_result_t result = ISC_R_SUCCESS;
unsigned int i, buckets_created = 0, dbuckets_created = 0;
isc_task_t *task = NULL;
REQUIRE(dispatchmgr != NULL);
REQUIRE(dispatchv4 != NULL || dispatchv6 != NULL);
- res = isc_mem_get(view->mctx, sizeof(*res));
RTRACE("create");
- res->mctx = view->mctx;
- res->rdclass = view->rdclass;
- res->socketmgr = socketmgr;
- res->timermgr = timermgr;
- res->taskmgr = taskmgr;
- res->dispatchmgr = dispatchmgr;
- res->view = view;
- res->options = options;
- res->lame_ttl = 0;
+ res = isc_mem_get(view->mctx, sizeof(*res));
+ *res = (dns_resolver_t){ .mctx = view->mctx,
+ .rdclass = view->rdclass,
+ .socketmgr = socketmgr,
+ .timermgr = timermgr,
+ .taskmgr = taskmgr,
+ .dispatchmgr = dispatchmgr,
+ .view = view,
+ .options = options,
+ .udpsize = DEFAULT_EDNS_BUFSIZE,
+ .spillatmin = 10,
+ .spillat = 10,
+ .spillatmax = 100,
+ .retryinterval = 30000,
+ .nonbackofftries = 3,
+ .query_timeout = DEFAULT_QUERY_TIMEOUT,
+ .maxdepth = DEFAULT_RECURSION_DEPTH,
+ .maxqueries = DEFAULT_MAX_QUERIES,
+ .nbuckets = ntasks,
+ .activebuckets = ntasks,
+ .querydscp4 = -1,
+ .querydscp6 = -1 };
+
+ res->quotaresp[dns_quotatype_zone] = DNS_R_DROP;
+ res->quotaresp[dns_quotatype_server] = DNS_R_SERVFAIL;
+ isc_refcount_init(&res->references, 1);
+ atomic_init(&res->exiting, false);
+ atomic_init(&res->priming, false);
+ atomic_init(&res->zspill, 0);
+ atomic_init(&res->nfctx, 0);
+ ISC_LIST_INIT(res->whenshutdown);
ISC_LIST_INIT(res->alternates);
- res->udpsize = DEFAULT_EDNS_BUFSIZE;
- res->algorithms = NULL;
- res->digests = NULL;
- res->badcache = NULL;
+
result = dns_badcache_init(res->mctx, DNS_RESOLVER_BADCACHESIZE,
&res->badcache);
if (result != ISC_R_SUCCESS) {
goto cleanup_res;
}
- res->mustbesecure = NULL;
- res->spillatmin = res->spillat = 10;
- res->spillatmax = 100;
- res->spillattimer = NULL;
- atomic_init(&res->zspill, 0);
- res->zero_no_soa_ttl = false;
- res->retryinterval = 30000;
- res->nonbackofftries = 3;
- res->query_timeout = DEFAULT_QUERY_TIMEOUT;
- res->maxdepth = DEFAULT_RECURSION_DEPTH;
- res->maxqueries = DEFAULT_MAX_QUERIES;
- res->quotaresp[dns_quotatype_zone] = DNS_R_DROP;
- res->quotaresp[dns_quotatype_server] = DNS_R_SERVFAIL;
- res->nbuckets = ntasks;
+
if (view->resstats != NULL) {
isc_stats_set(view->resstats, ntasks,
dns_resstatscounter_buckets);
}
- res->activebuckets = ntasks;
+
res->buckets = isc_mem_get(view->mctx, ntasks * sizeof(fctxbucket_t));
for (i = 0; i < ntasks; i++) {
isc_mutex_init(&res->buckets[i].lock);
dbuckets_created++;
}
- res->dispatches4 = NULL;
if (dispatchv4 != NULL) {
dns_dispatchset_create(view->mctx, socketmgr, taskmgr,
dispatchv4, &res->dispatches4, ndisp);
res->exclusivev4 = (dispattr & DNS_DISPATCHATTR_EXCLUSIVE);
}
- res->dispatches6 = NULL;
if (dispatchv6 != NULL) {
dns_dispatchset_create(view->mctx, socketmgr, taskmgr,
dispatchv6, &res->dispatches6, ndisp);
res->exclusivev6 = (dispattr & DNS_DISPATCHATTR_EXCLUSIVE);
}
- res->querydscp4 = -1;
- res->querydscp6 = -1;
- isc_refcount_init(&res->references, 1);
- atomic_init(&res->exiting, false);
- res->frozen = false;
- ISC_LIST_INIT(res->whenshutdown);
- atomic_init(&res->priming, false);
- res->primefetch = NULL;
-
- atomic_init(&res->nfctx, 0);
-
isc_mutex_init(&res->lock);
isc_mutex_init(&res->primelock);
- task = NULL;
result = isc_task_create(taskmgr, 0, &task);
if (result != ISC_R_SUCCESS) {
goto cleanup_primelock;
goto cleanup_primelock;
}
-#if USE_ALGLOCK
- isc_rwlock_init(&res->alglock, 0, 0);
-#endif /* if USE_ALGLOCK */
-#if USE_MBSLOCK
- isc_rwlock_init(&res->mbslock, 0, 0);
-#endif /* if USE_MBSLOCK */
-
res->magic = RES_MAGIC;
*resp = res;
dns_resolver_reset_algorithms(dns_resolver_t *resolver) {
REQUIRE(VALID_RESOLVER(resolver));
-#if USE_ALGLOCK
- RWLOCK(&resolver->alglock, isc_rwlocktype_write);
-#endif /* if USE_ALGLOCK */
if (resolver->algorithms != NULL) {
dns_rbt_destroy(&resolver->algorithms);
}
-#if USE_ALGLOCK
- RWUNLOCK(&resolver->alglock, isc_rwlocktype_write);
-#endif /* if USE_ALGLOCK */
}
isc_result_t
return (ISC_R_RANGE);
}
-#if USE_ALGLOCK
- RWLOCK(&resolver->alglock, isc_rwlocktype_write);
-#endif /* if USE_ALGLOCK */
if (resolver->algorithms == NULL) {
result = dns_rbt_create(resolver->mctx, free_algorithm,
resolver->mctx, &resolver->algorithms);
}
result = ISC_R_SUCCESS;
cleanup:
-#if USE_ALGLOCK
- RWUNLOCK(&resolver->alglock, isc_rwlocktype_write);
-#endif /* if USE_ALGLOCK */
return (result);
}
return (false);
}
-#if USE_ALGLOCK
- RWLOCK(&resolver->alglock, isc_rwlocktype_read);
-#endif /* if USE_ALGLOCK */
if (resolver->algorithms == NULL) {
goto unlock;
}
}
}
unlock:
-#if USE_ALGLOCK
- RWUNLOCK(&resolver->alglock, isc_rwlocktype_read);
-#endif /* if USE_ALGLOCK */
if (found) {
return (false);
}
dns_resolver_reset_ds_digests(dns_resolver_t *resolver) {
REQUIRE(VALID_RESOLVER(resolver));
-#if USE_ALGLOCK
- RWLOCK(&resolver->alglock, isc_rwlocktype_write);
-#endif /* if USE_ALGLOCK */
if (resolver->digests != NULL) {
dns_rbt_destroy(&resolver->digests);
}
-#if USE_ALGLOCK
- RWUNLOCK(&resolver->alglock, isc_rwlocktype_write);
-#endif /* if USE_ALGLOCK */
}
isc_result_t
return (ISC_R_RANGE);
}
-#if USE_ALGLOCK
- RWLOCK(&resolver->alglock, isc_rwlocktype_write);
-#endif /* if USE_ALGLOCK */
if (resolver->digests == NULL) {
result = dns_rbt_create(resolver->mctx, free_digest,
resolver->mctx, &resolver->digests);
}
result = ISC_R_SUCCESS;
cleanup:
-#if USE_ALGLOCK
- RWUNLOCK(&resolver->alglock, isc_rwlocktype_write);
-#endif /* if USE_ALGLOCK */
return (result);
}
REQUIRE(VALID_RESOLVER(resolver));
-#if USE_ALGLOCK
- RWLOCK(&resolver->alglock, isc_rwlocktype_read);
-#endif /* if USE_ALGLOCK */
if (resolver->digests == NULL) {
goto unlock;
}
}
}
unlock:
-#if USE_ALGLOCK
- RWUNLOCK(&resolver->alglock, isc_rwlocktype_read);
-#endif /* if USE_ALGLOCK */
if (found) {
return (false);
}
dns_resolver_resetmustbesecure(dns_resolver_t *resolver) {
REQUIRE(VALID_RESOLVER(resolver));
-#if USE_MBSLOCK
- RWLOCK(&resolver->mbslock, isc_rwlocktype_write);
-#endif /* if USE_MBSLOCK */
if (resolver->mustbesecure != NULL) {
dns_rbt_destroy(&resolver->mustbesecure);
}
-#if USE_MBSLOCK
- RWUNLOCK(&resolver->mbslock, isc_rwlocktype_write);
-#endif /* if USE_MBSLOCK */
}
static bool yes = true, no = false;
REQUIRE(VALID_RESOLVER(resolver));
-#if USE_MBSLOCK
- RWLOCK(&resolver->mbslock, isc_rwlocktype_write);
-#endif /* if USE_MBSLOCK */
if (resolver->mustbesecure == NULL) {
result = dns_rbt_create(resolver->mctx, NULL, NULL,
&resolver->mustbesecure);
result = dns_rbt_addname(resolver->mustbesecure, name,
value ? &yes : &no);
cleanup:
-#if USE_MBSLOCK
- RWUNLOCK(&resolver->mbslock, isc_rwlocktype_write);
-#endif /* if USE_MBSLOCK */
return (result);
}
REQUIRE(VALID_RESOLVER(resolver));
-#if USE_MBSLOCK
- RWLOCK(&resolver->mbslock, isc_rwlocktype_read);
-#endif /* if USE_MBSLOCK */
if (resolver->mustbesecure == NULL) {
goto unlock;
}
value = *(bool *)data;
}
unlock:
-#if USE_MBSLOCK
- RWUNLOCK(&resolver->mbslock, isc_rwlocktype_read);
-#endif /* if USE_MBSLOCK */
return (value);
}