mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 14:35:26 +00:00
Remove ns_client_t .shuttingdown member
The way the ns_client_t .shuttingdown member was practically dead code. The .shuttingdown would be set to true only in ns__client_put() function meaning that we have detached from all ns_client_t .*handles and the ns_client_t object being freed: client->magic = 0; client->shuttingdown = true; [...] isc_mem_put(manager->ctx, client, sizeof(*client)) Meanwhile the ns_client_t object is accessed like this: isc_nmhandle_detach(&client->fetchhandle); client->query.attributes &= ~NS_QUERYATTR_RECURSING; client->state = NS_CLIENTSTATE_WORKING; qctx_init(client, &devent, 0, &qctx); client_shuttingdown = ns_client_shuttingdown(client); if (fetch_canceled || fetch_answered || client_shuttingdown) { [...] } Even if the isc_nmhandle_detach(...) was the last handle detach, it would mean that immediatelly, after calling the isc_nmhandle_detach(), we would be causing use-after-free, because the ns_client_t is immediatelly destroyed after setting .shuttingdown to true. The similar code in the query_hookresume() already noticed this: /* * This event is running under a client task, so it's safe to detach * the fetch handle. And it should be done before resuming query * processing below, since that may trigger another recursion or * asynchronous hook event. */
This commit is contained in:
@@ -1672,7 +1672,6 @@ ns__client_put_cb(void *client0) {
|
||||
client_extendederror_reset(client);
|
||||
|
||||
client->magic = 0;
|
||||
client->shuttingdown = true;
|
||||
|
||||
isc_mem_put(manager->mctx, client->sendbuf, NS_CLIENT_SEND_BUFFER_SIZE);
|
||||
if (client->opt != NULL) {
|
||||
@@ -2364,11 +2363,6 @@ cleanup:
|
||||
return (result);
|
||||
}
|
||||
|
||||
bool
|
||||
ns_client_shuttingdown(ns_client_t *client) {
|
||||
return (client->shuttingdown);
|
||||
}
|
||||
|
||||
/***
|
||||
*** Client Manager
|
||||
***/
|
||||
|
Reference in New Issue
Block a user