From c8dd7e07cd9a74fd03fd3731e57a1bfaece5898f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Kr=C4=99cicki?= Date: Mon, 17 Feb 2020 15:52:09 +0100 Subject: [PATCH] Don't issue ns_client_endrequest on a NS_CLIENTSTATE_READY client. Fix a potential assertion failure on shutdown in ns__client_endrequest. Scenario: 1. We are shutting down, interface->clientmgr is gone. 2. We receive a packet, it gets through ns__client_request 3. mgr == NULL, return 4. isc_nmhandle_detach calls ns_client_reset_cb 5. ns_client_reset_cb calls ns_client_endrequest 6. INSIST(client->state == NS_CLIENTSTATE_WORKING || client->state == NS_CLIENTSTATE_RECURSING) is not met - we haven't started processing this packet so client->state == NS_CLIENTSTATE_READY. As a solution - don't do anything in ns_client_reset_cb if the client is still in READY state. (cherry picked from commit b0888ff0398687793c83a46a7ce64eea1ca24899) --- lib/ns/client.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/ns/client.c b/lib/ns/client.c index 63a6441ee5..269ebe1366 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -1577,6 +1577,14 @@ ns__client_reset_cb(void *client0) { ns_client_log(client, DNS_LOGCATEGORY_SECURITY, NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(3), "reset client"); + /* + * We never started processing this client, possible if we're + * shutting down, just exit. + */ + if (client->state == NS_CLIENTSTATE_READY) { + return; + } + ns_client_endrequest(client); if (client->tcpbuf != NULL) { isc_mem_put(client->mctx, client->tcpbuf,