diff --git a/CHANGES b/CHANGES index 80c7812558..4ab357befc 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +2138. [bug] Lock order reversal in resolver.c. [RT #16653] + 2137. [port] Mips little endian and/or mips 64 bit are now supported for atomic operations. [RT#16648] diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index c1cfe5e02c..491270d9d6 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.342 2007/02/07 04:49:18 marka Exp $ */ +/* $Id: resolver.c,v 1.343 2007/02/14 23:40:01 marka Exp $ */ /*! \file */ @@ -6634,6 +6634,7 @@ dns_resolver_createfetch2(dns_resolver_t *res, dns_name_t *name, isc_boolean_t new_fctx = ISC_FALSE; isc_event_t *event; unsigned int count = 0; + unsigned int spillat; UNUSED(forwarders); @@ -6662,6 +6663,9 @@ dns_resolver_createfetch2(dns_resolver_t *res, dns_name_t *name, bucketnum = dns_name_fullhash(name, ISC_FALSE) % res->nbuckets; + LOCK(&res->lock); + spillat = res->spillat; + UNLOCK(&res->lock); LOCK(&res->buckets[bucketnum].lock); if (res->buckets[bucketnum].exiting) { @@ -6695,12 +6699,8 @@ dns_resolver_createfetch2(dns_resolver_t *res, dns_name_t *name, } } if (count >= res->spillatmin && res->spillatmin != 0) { - if (!fctx->spilled) { - LOCK(&fctx->res->lock); - if (count >= res->spillat) - fctx->spilled = ISC_TRUE; - UNLOCK(&fctx->res->lock); - } + if (count >= spillat) + fctx->spilled = ISC_TRUE; if (fctx->spilled) { result = DNS_R_DROP; goto unlock;