From: Mark Andrews Date: Thu, 3 Feb 2005 05:07:35 +0000 (+0000) Subject: 1808. [bug] zone.c:notify_zone() contained a race condition, X-Git-Tag: v9.2.6b1~181^2~63 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=5cf146c586f69af7c65e4a4f612ae3ef6c9cf8de;p=thirdparty%2Fbind9.git 1808. [bug] zone.c:notify_zone() contained a race condition, zone->db could change underneath it. [RT #13511] --- diff --git a/CHANGES b/CHANGES index deb5105dab9..4e628031ec7 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,7 @@ 1809. [placeholder] rt13463 -1808. [placeholder] rt13511 +1808. [bug] zone.c:notify_zone() contained a race condition, + zone->db could change underneath it. [RT #13511] 1807. [placeholder] rt13526 diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 73cae607395..7d3a664eba7 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone.c,v 1.429 2005/01/11 23:10:05 marka Exp $ */ +/* $Id: zone.c,v 1.430 2005/02/03 05:07:35 marka Exp $ */ #include @@ -3042,6 +3042,7 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) { dns_notifytype_t notifytype; unsigned int flags = 0; isc_boolean_t loggednotify = ISC_FALSE; + dns_db_t *db = NULL; REQUIRE(DNS_ZONE_VALID(zone)); @@ -3061,6 +3062,13 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) { zone->type != dns_zone_master) return; + LOCK_ZONE(zone); + if (zone->db != NULL) + dns_db_attach(zone->db, &db); + UNLOCK_ZONE(zone); + if (db == NULL) + return; + origin = &zone->origin; /* @@ -3073,14 +3081,13 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) { /* * Get SOA RRset. */ - dns_db_currentversion(zone->db, &version); - result = dns_db_findnode(zone->db, origin, ISC_FALSE, &node); + dns_db_currentversion(db, &version); + result = dns_db_findnode(db, origin, ISC_FALSE, &node); if (result != ISC_R_SUCCESS) goto cleanup1; dns_rdataset_init(&soardset); - result = dns_db_findrdataset(zone->db, node, version, - dns_rdatatype_soa, + result = dns_db_findrdataset(db, node, version, dns_rdatatype_soa, dns_rdatatype_none, 0, &soardset, NULL); if (result != ISC_R_SUCCESS) goto cleanup2; @@ -3137,8 +3144,7 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) { */ dns_rdataset_init(&nsrdset); - result = dns_db_findrdataset(zone->db, node, version, - dns_rdatatype_ns, + result = dns_db_findrdataset(db, node, version, dns_rdatatype_ns, dns_rdatatype_none, 0, &nsrdset, NULL); if (result != ISC_R_SUCCESS) goto cleanup3; @@ -3195,9 +3201,10 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) { if (dns_name_dynamic(&master)) dns_name_free(&master, zone->mctx); cleanup2: - dns_db_detachnode(zone->db, &node); + dns_db_detachnode(db, &node); cleanup1: - dns_db_closeversion(zone->db, &version, ISC_FALSE); + dns_db_closeversion(db, &version, ISC_FALSE); + dns_db_detach(&db); } /***