2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 14:35:26 +00:00

Obtain a client->handle reference when calling async_restart

otherwise client may be freed before async_restart is called.
This commit is contained in:
Mark Andrews
2023-12-08 13:57:14 +11:00
parent 6a2ebd4f10
commit 7ab4e1537a
2 changed files with 12 additions and 5 deletions

View File

@@ -169,11 +169,12 @@ struct ns_client {
unsigned int attributes;
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 *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 *updatehandle; /* Waiting for update callback */
isc_nmhandle_t *restarthandle; /* Waiting for restart callback */
unsigned char *tcpbuf;
size_t tcpbuf_size;
dns_message_t *message;

View File

@@ -5834,6 +5834,9 @@ static void
async_restart(void *arg) {
query_ctx_t *qctx = arg;
ns_client_t *client = qctx->client;
isc_nmhandle_t *handle = client->restarthandle;
client->restarthandle = NULL;
ns__query_start(qctx);
@@ -5841,6 +5844,7 @@ async_restart(void *arg) {
qctx_freedata(qctx);
qctx_destroy(qctx);
isc_mem_put(client->manager->mctx, qctx, sizeof(*qctx));
isc_nmhandle_detach(&handle);
}
/*
@@ -11642,6 +11646,8 @@ ns_query_done(query_ctx_t *qctx) {
saved_qctx = isc_mem_get(qctx->client->manager->mctx,
sizeof(*saved_qctx));
qctx_save(qctx, saved_qctx);
isc_nmhandle_attach(qctx->client->handle,
&qctx->client->restarthandle);
isc_async_run(qctx->client->manager->loop, async_restart,
saved_qctx);
return (DNS_R_CONTINUE);