]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2138. [bug] Lock order reversal in resolver.c. [RT #16653]
authorMark Andrews <marka@isc.org>
Wed, 14 Feb 2007 23:40:01 +0000 (23:40 +0000)
committerMark Andrews <marka@isc.org>
Wed, 14 Feb 2007 23:40:01 +0000 (23:40 +0000)
CHANGES
lib/dns/resolver.c

diff --git a/CHANGES b/CHANGES
index 80c781255821927a6bc2bde455e7543d858b865f..4ab357befc18fbc855e5bc5b1c4625395d83362b 100644 (file)
--- 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]
 
index c1cfe5e02c8574a0b31642844a513440456a7530..491270d9d63bbfd91e7e242f24c53d229d9a34da 100644 (file)
@@ -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;