Fixes a race between ns_client_killoldestquery and ns_client_endrequest -
killoldestquery takes a client from `recursing` list while endrequest
destroys client object, then killoldestquery works on a destroyed client
object. Prevent it by holding reclist lock while cancelling query.
oldest = ISC_LIST_HEAD(client->manager->recursing);
if (oldest != NULL) {
ISC_LIST_UNLINK(client->manager->recursing, oldest, rlink);
- UNLOCK(&client->manager->reclock);
ns_query_cancel(oldest);
ns_stats_increment(client->sctx->nsstats,
ns_statscounter_reclimitdropped);
- } else {
- UNLOCK(&client->manager->reclock);
}
+ UNLOCK(&client->manager->reclock);
}
void