mirror of
https://github.com/isc-projects/bind9.git
synced 2026-02-25 02:42:33 -05:00
3025. [bug] Fixed a possible deadlock due to zone resigning.
[RT #22964]
This commit is contained in:
parent
0cae8f10b7
commit
87519dfd8f
3 changed files with 14 additions and 7 deletions
3
CHANGES
3
CHANGES
|
|
@ -1,3 +1,6 @@
|
|||
3025. [bug] Fixed a possible deadlock due to zone resigning.
|
||||
[RT #22964]
|
||||
|
||||
3023. [bug] Named could be left in an inconsistent state when
|
||||
receiving multiple AXFR response messages that were
|
||||
not all TSIG-signed. [RT #23254]
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: rbtdb.c,v 1.292.8.15 2010/12/02 05:07:03 marka Exp $ */
|
||||
/* $Id: rbtdb.c,v 1.292.8.16 2011/02/19 00:46:45 each Exp $ */
|
||||
|
||||
/*! \file */
|
||||
|
||||
|
|
@ -391,12 +391,15 @@ typedef ISC_LIST(rbtdb_version_t) rbtdb_versionlist_t;
|
|||
typedef struct {
|
||||
/* Unlocked. */
|
||||
dns_db_t common;
|
||||
/* Locks the data in this struct */
|
||||
#if DNS_RBTDB_USERWLOCK
|
||||
isc_rwlock_t lock;
|
||||
#else
|
||||
isc_mutex_t lock;
|
||||
#endif
|
||||
/* Locks the tree structure (prevents nodes appearing/disappearing) */
|
||||
isc_rwlock_t tree_lock;
|
||||
/* Locks for individual tree nodes */
|
||||
unsigned int node_lock_count;
|
||||
rbtdb_nodelock_t * node_locks;
|
||||
dns_rbtnode_t * origin_node;
|
||||
|
|
@ -7035,7 +7038,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset,
|
|||
|
||||
REQUIRE(VALID_RBTDB(rbtdb));
|
||||
|
||||
RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read);
|
||||
RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
|
||||
|
||||
for (i = 0; i < rbtdb->node_lock_count; i++) {
|
||||
NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_read);
|
||||
|
|
@ -7071,7 +7074,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset,
|
|||
result = ISC_R_SUCCESS;
|
||||
|
||||
unlock:
|
||||
RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read);
|
||||
RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
|
@ -7093,7 +7096,7 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
|
|||
header = rdataset->private3;
|
||||
header--;
|
||||
|
||||
RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write);
|
||||
RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
|
||||
NODE_LOCK(&rbtdb->node_locks[node->locknum].lock,
|
||||
isc_rwlocktype_write);
|
||||
/*
|
||||
|
|
@ -7107,7 +7110,7 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
|
|||
|
||||
NODE_UNLOCK(&rbtdb->node_locks[node->locknum].lock,
|
||||
isc_rwlocktype_write);
|
||||
RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write);
|
||||
RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
|
||||
}
|
||||
|
||||
static dns_stats_t *
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: zone.c,v 1.540.2.44 2011/02/17 23:46:21 tbox Exp $ */
|
||||
/* $Id: zone.c,v 1.540.2.45 2011/02/19 00:46:45 each Exp $ */
|
||||
|
||||
/*! \file */
|
||||
|
||||
|
|
@ -7895,7 +7895,8 @@ void
|
|||
dns_zone_markdirty(dns_zone_t *zone) {
|
||||
|
||||
LOCK_ZONE(zone);
|
||||
set_resigntime(zone); /* XXXMPA make separate call back */
|
||||
if (zone->type == dns_zone_master)
|
||||
set_resigntime(zone); /* XXXMPA make separate call back */
|
||||
zone_needdump(zone, DNS_DUMP_DELAY);
|
||||
UNLOCK_ZONE(zone);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue