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 b0888ff039)
This commit is contained in:
Witold Kręcicki 2020-02-17 15:52:09 +01:00 committed by Witold Krecicki
parent 9f7acb1dd0
commit c8dd7e07cd

View file

@ -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,