From: Ondřej Surý Date: Tue, 15 Sep 2020 10:55:03 +0000 (+0200) Subject: Add separate prefetch nmhandle to ns_client_t X-Git-Tag: v9.16.8~17^2 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=7a90ad1fe2d2420ce70e8c73271bf72ab326bd6f;p=thirdparty%2Fbind9.git Add separate prefetch nmhandle to ns_client_t As the query_prefetch() or query_rpzfetch() could be called during "regular" fetch, we need to introduce separate storage for attaching the nmhandle during prefetching the records. The query_prefetch() and query_rpzfetch() are guarded for re-entrance by .query.prefetch member of ns_client_t, so we can reuse the same .prefetchhandle for both. (cherry picked from commit d4976e0ebeb6a29a6844d83bcd4be626fb9f8fbf) --- diff --git a/lib/ns/include/ns/client.h b/lib/ns/include/ns/client.h index 33eff5938eb..fb7b86ffbfb 100644 --- a/lib/ns/include/ns/client.h +++ b/lib/ns/include/ns/client.h @@ -183,12 +183,13 @@ struct ns_client { isc_task_t * task; dns_view_t * view; dns_dispatch_t * dispatch; - isc_nmhandle_t * handle; /* Permanent pointer to handle */ - isc_nmhandle_t * sendhandle; /* Waiting for send callback */ - isc_nmhandle_t * reqhandle; /* Waiting for request callback - (query, update, notify) */ - isc_nmhandle_t *fetchhandle; /* Waiting for recursive fetch */ - isc_nmhandle_t *updatehandle; /* Waiting for update callback */ + isc_nmhandle_t * handle; /* Permanent pointer to handle */ + isc_nmhandle_t * sendhandle; /* Waiting for send callback */ + isc_nmhandle_t * reqhandle; /* Waiting for request callback + (query, update, notify) */ + isc_nmhandle_t *fetchhandle; /* Waiting for recursive fetch */ + isc_nmhandle_t *prefetchhandle; /* Waiting for prefetch / rpzfetch */ + isc_nmhandle_t *updatehandle; /* Waiting for update callback */ unsigned char * tcpbuf; dns_message_t * message; unsigned char * sendbuf; diff --git a/lib/ns/query.c b/lib/ns/query.c index b16cb527b81..207ad9ddccf 100644 --- a/lib/ns/query.c +++ b/lib/ns/query.c @@ -2471,7 +2471,7 @@ prefetch_done(isc_task_t *task, isc_event_t *event) { } free_devent(client, &event, &devent); - isc_nmhandle_detach(&client->fetchhandle); + isc_nmhandle_detach(&client->prefetchhandle); } static void @@ -2514,7 +2514,7 @@ query_prefetch(ns_client_t *client, dns_name_t *qname, peeraddr = NULL; } - isc_nmhandle_attach(client->handle, &client->fetchhandle); + isc_nmhandle_attach(client->handle, &client->prefetchhandle); options = client->query.fetchoptions | DNS_FETCHOPT_PREFETCH; result = dns_resolver_createfetch( client->view->resolver, qname, rdataset->type, NULL, NULL, NULL, @@ -2523,7 +2523,7 @@ query_prefetch(ns_client_t *client, dns_name_t *qname, &client->query.prefetch); if (result != ISC_R_SUCCESS) { ns_client_putrdataset(client, &tmprdataset); - isc_nmhandle_detach(&client->fetchhandle); + isc_nmhandle_detach(&client->prefetchhandle); } dns_rdataset_clearprefetch(rdataset); @@ -2728,7 +2728,7 @@ query_rpzfetch(ns_client_t *client, dns_name_t *qname, dns_rdatatype_t type) { } options = client->query.fetchoptions; - isc_nmhandle_attach(client->handle, &client->fetchhandle); + isc_nmhandle_attach(client->handle, &client->prefetchhandle); result = dns_resolver_createfetch( client->view->resolver, qname, type, NULL, NULL, NULL, peeraddr, client->message->id, options, 0, NULL, client->task, @@ -2736,7 +2736,7 @@ query_rpzfetch(ns_client_t *client, dns_name_t *qname, dns_rdatatype_t type) { &client->query.prefetch); if (result != ISC_R_SUCCESS) { ns_client_putrdataset(client, &tmprdataset); - isc_nmhandle_detach(&client->fetchhandle); + isc_nmhandle_detach(&client->prefetchhandle); } }