mirror of
https://github.com/isc-projects/bind9.git
synced 2026-04-22 23:01:43 -04:00
pullup:
1129. [bug] Multithreaded servers could crash under heavy
resolution load due to a race condition. [RT #2018]
This commit is contained in:
parent
913e3def6d
commit
fefab489c7
2 changed files with 7 additions and 15 deletions
3
CHANGES
3
CHANGES
|
|
@ -1,3 +1,6 @@
|
|||
1129. [bug] Multithreaded servers could crash under heavy
|
||||
resolution load due to a race condition. [RT #2018]
|
||||
|
||||
1126. [bug] The server could access a freed event if shut
|
||||
down while a client start event was pending
|
||||
delivery. [RT #2061]
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: rbtdb.c,v 1.168 2001/08/27 03:58:44 marka Exp $ */
|
||||
/* $Id: rbtdb.c,v 1.168.2.1 2001/11/16 11:04:38 marka Exp $ */
|
||||
|
||||
/*
|
||||
* Principal Author: Bob Halley
|
||||
|
|
@ -746,7 +746,6 @@ no_references(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
|
|||
{
|
||||
isc_result_t result;
|
||||
isc_boolean_t write_locked;
|
||||
isc_boolean_t reacquire;
|
||||
unsigned int locknum;
|
||||
|
||||
/*
|
||||
|
|
@ -786,15 +785,12 @@ no_references(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
|
|||
/*
|
||||
* XXXDCL need to add a deferred delete method for ISC_R_LOCKBUSY.
|
||||
*/
|
||||
reacquire = ISC_FALSE;
|
||||
if (lock != isc_rwlocktype_write) {
|
||||
/*
|
||||
* Free the node lock before acquiring a tree write lock, per
|
||||
* the lock hierarchy rules stated at the start of this file.
|
||||
* Locking hierarchy notwithstanding, we don't need to free
|
||||
* the node lock before acquiring the tree write lock because
|
||||
* we only do a trylock.
|
||||
*/
|
||||
UNLOCK(&rbtdb->node_locks[locknum].lock);
|
||||
reacquire = ISC_TRUE;
|
||||
|
||||
if (lock == isc_rwlocktype_read)
|
||||
RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
|
||||
|
||||
|
|
@ -804,7 +800,6 @@ no_references(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
|
|||
result == ISC_R_LOCKBUSY);
|
||||
|
||||
write_locked = ISC_TF(result == ISC_R_SUCCESS);
|
||||
|
||||
} else
|
||||
write_locked = ISC_TRUE;
|
||||
|
||||
|
|
@ -837,12 +832,6 @@ no_references(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
|
|||
|
||||
if (lock == isc_rwlocktype_read)
|
||||
RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
|
||||
|
||||
/*
|
||||
* Reacquire the node lock that the caller held if necessary.
|
||||
*/
|
||||
if (reacquire)
|
||||
LOCK(&rbtdb->node_locks[locknum].lock);
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
|
|||
Loading…
Reference in a new issue