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.
* 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
* 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.
* 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
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;
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);
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);
}