]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add separate prefetch nmhandle to ns_client_t
authorOndřej Surý <ondrej@sury.org>
Tue, 15 Sep 2020 10:55:03 +0000 (12:55 +0200)
committerOndřej Surý <ondrej@sury.org>
Tue, 22 Sep 2020 07:56:26 +0000 (09:56 +0200)
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.

lib/ns/include/ns/client.h
lib/ns/query.c

index 33eff5938eb515037d00eaf219fe4a55254d6ada..fb7b86ffbfb0ee5a7becdba2897899df2871a841 100644 (file)
@@ -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;
index 5f8a355d96693d0dbf336f4289610e480ca94fcb..2e1b27d78def3e77db46611d616a836a1162698c 100644 (file)
@@ -2475,7 +2475,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
@@ -2518,7 +2518,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,
@@ -2527,7 +2527,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);
@@ -2732,7 +2732,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,
@@ -2740,7 +2740,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);
        }
 }