From: Mark Andrews Date: Wed, 30 Sep 2015 04:58:31 +0000 (+1000) Subject: 4228. [bug] Address race condition in dns_client_destroyrestrans. X-Git-Tag: v9.11.0a1~404 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=8a0b6b3901b34530a850d78758fe4e5b6218d193;p=thirdparty%2Fbind9.git 4228. [bug] Address race condition in dns_client_destroyrestrans. [RT #40605] --- diff --git a/CHANGES b/CHANGES index 773daf5f493..65e1f290e09 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 c150fd19e8f..394a6d0fd09 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));