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:
@@ -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;
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user