diff --git a/CHANGES b/CHANGES index 773daf5f49..65e1f290e0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4228. [bug] Address race condition in dns_client_destroyrestrans. + [RT #40605] + 4227. [bug] Silence static analysis warnings. [RT #40828] 4226. [bug] Address a theoretical shutdown race in diff --git a/lib/dns/client.c b/lib/dns/client.c index c150fd19e8..394a6d0fd0 100644 --- a/lib/dns/client.c +++ b/lib/dns/client.c @@ -1178,7 +1178,6 @@ client_resfind(resctx_t *rctx, dns_fetchevent_t *event) { UNLOCK(&rctx->lock); } - static void suspend(isc_task_t *task, isc_event_t *event) { isc_appctx_t *actx = event->ev_arg; @@ -1498,6 +1497,13 @@ dns_client_destroyrestrans(dns_clientrestrans_t **transp) { mctx = client->mctx; dns_view_detach(&rctx->view); + /* + * Wait for the lock in client_resfind to be released before + * destroying the lock. + */ + LOCK(&rctx->lock); + UNLOCK(&rctx->lock); + LOCK(&client->lock); INSIST(ISC_LINK_LINKED(rctx, link));