mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 15:05:23 +00:00
Destroy query in killoldestquery under a lock.
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.
This commit is contained in:
committed by
Witold Krecicki
parent
4c0591574f
commit
df3dbdff81
@@ -170,13 +170,11 @@ ns_client_killoldestquery(ns_client_t *client) {
|
|||||||
oldest = ISC_LIST_HEAD(client->manager->recursing);
|
oldest = ISC_LIST_HEAD(client->manager->recursing);
|
||||||
if (oldest != NULL) {
|
if (oldest != NULL) {
|
||||||
ISC_LIST_UNLINK(client->manager->recursing, oldest, rlink);
|
ISC_LIST_UNLINK(client->manager->recursing, oldest, rlink);
|
||||||
UNLOCK(&client->manager->reclock);
|
|
||||||
ns_query_cancel(oldest);
|
ns_query_cancel(oldest);
|
||||||
ns_stats_increment(client->sctx->nsstats,
|
ns_stats_increment(client->sctx->nsstats,
|
||||||
ns_statscounter_reclimitdropped);
|
ns_statscounter_reclimitdropped);
|
||||||
} else {
|
|
||||||
UNLOCK(&client->manager->reclock);
|
|
||||||
}
|
}
|
||||||
|
UNLOCK(&client->manager->reclock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Reference in New Issue
Block a user