]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
pullup:
authorBrian Wellington <source@isc.org>
Fri, 12 Jan 2001 20:31:14 +0000 (20:31 +0000)
committerBrian Wellington <source@isc.org>
Fri, 12 Jan 2001 20:31:14 +0000 (20:31 +0000)
 678.   [bug]           "tranfer-format one-answer;" could trigger an assertion
                        failure. [RT #646]

CHANGES
lib/dns/include/dns/dbiterator.h
lib/dns/rbtdb.c

diff --git a/CHANGES b/CHANGES
index a1a4767c58352db761a2f4b0c267af8e7a60e12c..66dfc2bb5f5f5922594ed536598db17e4a8d0dc6 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
  679.  [bug]           $INCLUDE could leak memory and file descriptors on
                        reload. [RT #639]
 
+ 678.  [bug]           "tranfer-format one-answer;" could trigger an assertion
+                       failure. [RT #646]
+
  676.  [bug]           Log messages about lame servers to category
                        'lame-servers' rather than 'resolver', so as not
                        to be gratuitously incompatible with BIND 8.
index 0b4e0214071b1e842b59ee3aba1cdaaf4b288b2c..4af6cd6f1224fb31dc9c6ae038fd341c69e717b2 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dbiterator.h,v 1.14.4.1 2001/01/09 22:45:31 bwelling Exp $ */
+/* $Id: dbiterator.h,v 1.14.4.2 2001/01/12 20:31:14 bwelling Exp $ */
 
 #ifndef DNS_DBITERATOR_H
 #define DNS_DBITERATOR_H 1
@@ -251,8 +251,6 @@ dns_dbiterator_pause(dns_dbiterator_t *iterator);
  * Requires:
  *     'iterator' is a valid iterator.
  *
- *     'iterator' has not been paused already.
- *
  * Ensures:
  *     Any database locks being held for efficiency of iterator access are
  *     released.
index 6ba5861196a830ec29cd89f79893d33b3f8e7cd9..b18e231cecaee13f3a044f25eb36e3e3c3522afe 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: rbtdb.c,v 1.139.4.1 2001/01/09 22:43:58 bwelling Exp $ */
+/* $Id: rbtdb.c,v 1.139.4.2 2001/01/12 20:31:11 bwelling Exp $ */
 
 /*
  * Principal Author: Bob Halley
@@ -260,6 +260,10 @@ static dns_dbiteratormethods_t dbiterator_methods = {
        dbiterator_origin
 };
 
+/*
+ * If 'paused' is ISC_TRUE, we are holding a reference to 'node',
+ * and we are not holding any locks.
+ */
 typedef struct rbtdb_dbiterator {
        dns_dbiterator_t                common;
        isc_boolean_t                   paused;
@@ -4662,10 +4666,11 @@ dbiterator_pause(dns_dbiterator_t *iterator) {
            rbtdbiter->result != ISC_R_NOMORE)
                return (rbtdbiter->result);
 
-       REQUIRE(!rbtdbiter->paused);
-       REQUIRE(rbtdbiter->tree_locked);
+       if (rbtdbiter->paused)
+               return (ISC_R_SUCCESS);
 
        if (node != NULL) {
+               INSIST(rbtdbiter->tree_locked);
                LOCK(&rbtdb->node_locks[node->locknum].lock);
                new_reference(rbtdb, node);
                UNLOCK(&rbtdb->node_locks[node->locknum].lock);
@@ -4673,8 +4678,10 @@ dbiterator_pause(dns_dbiterator_t *iterator) {
                rbtdbiter->paused = ISC_TRUE;
        }
 
-       RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
-       rbtdbiter->tree_locked = ISC_FALSE;
+       if (rbtdbiter->tree_locked) {
+               RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+               rbtdbiter->tree_locked = ISC_FALSE;
+       }
 
        return (ISC_R_SUCCESS);
 }