From: Matthijs Mekking Date: Thu, 6 Nov 2025 09:41:50 +0000 (+0100) Subject: Schedule a zonefetch X-Git-Tag: v9.21.16~59^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=868ede012cc21918d4961ccc94b256f12c46902a;p=thirdparty%2Fbind9.git Schedule a zonefetch Scheduling and rescheduling a zonefetch is also similar. Refactor into zonefetch functions. This also increments and decrements the zone's internal reference counter in the same module, which may be less confusing when reading the code. --- diff --git a/lib/dns/include/dns/zonefetch.h b/lib/dns/include/dns/zonefetch.h index 01f189b81d1..2ea51082814 100644 --- a/lib/dns/include/dns/zonefetch.h +++ b/lib/dns/include/dns/zonefetch.h @@ -106,6 +106,32 @@ dns_zonefetch_done(void *arg); * the fetch type. */ +void +dns_zonefetch_schedule(dns_zonefetch_t *fetch, dns_name_t *name); +/*%< + * Schedule a zone fetch, starting at 'name'. Initializes the rdata sets, + * and sets the starting name to 'name'. Note that the query type is + * determined by the type of zone fetch. This function also increments the + * corresponding zone's ireferences (to be decremented in + * dns_zonefetch_done()). + * + * Requires: + * 'fetch' is not NULL. + * 'name' is not NULL. + */ + +void +dns_zonefetch_reschedule(dns_zonefetch_t *fetch); +/*%< + * Reschedule a zone fetch. Initializes the rdata sets and increments the + * corresponding zone's ireferences (to be decremented in + * dns_zonefetch_done()). + * + * Requires: + * 'fetch' is not NULL. + * 'name' is not NULL. + */ + isc_result_t dns_zonefetch_verify(dns_zonefetch_t *fetch, isc_result_t eresult, dns_trust_t trust); diff --git a/lib/dns/zone.c b/lib/dns/zone.c index cf7b2bed684..a9acedda42c 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -11332,7 +11332,7 @@ zone_refreshkeys(dns_zone_t *zone) { result = dns_rriterator_nextrrset(&rrit)) { isc_stdtime_t timer = 0xffffffff; - dns_name_t *name = NULL, *kname = NULL; + dns_name_t *name = NULL; dns_rdataset_t *kdset = NULL; uint32_t ttl; @@ -11411,28 +11411,22 @@ zone_refreshkeys(dns_zone_t *zone) { isc_mem_attach(zone->mctx, &fetch->mctx); zone->fetchcount[ZONEFETCHTYPE_KEY]++; - isc_refcount_increment0(&zone->irefs); - kname = dns_fixedname_initname(&fetch->name); - dns_name_dup(name, zone->mctx, kname); - dns_rdataset_init(&fetch->rrset); - dns_rdataset_init(&fetch->sigset); kfetch = &fetch->fetchdata.keyfetch; dns_rdataset_init(&kfetch->keydataset); dns_rdataset_clone(kdset, &kfetch->keydataset); dns_db_attach(db, &kfetch->db); + dns_zonefetch_schedule(fetch, name); + if (isc_log_wouldlog(ISC_LOG_DEBUG(3))) { char namebuf[DNS_NAME_FORMATSIZE]; - dns_name_format(kname, namebuf, - sizeof(namebuf)); + dns_name_format(name, namebuf, sizeof(namebuf)); dnssec_log(zone, ISC_LOG_DEBUG(3), "Creating key fetch in " "zone_refreshkeys() for '%s'", namebuf); } - - isc_async_run(zone->loop, dns_zonefetch_run, fetch); fetching = true; #ifdef ENABLE_AFL } @@ -21112,16 +21106,14 @@ nsfetch_continue(dns_zonefetch_t *fetch) { #endif /* ifdef ENABLE_AFL */ LOCK_ZONE(zone); zone->fetchcount[ZONEFETCHTYPE_NS]++; - isc_refcount_increment0(&zone->irefs); - dns_rdataset_init(&fetch->rrset); - dns_rdataset_init(&fetch->sigset); + dns_zonefetch_reschedule(fetch); + if (isc_log_wouldlog(ISC_LOG_DEBUG(3))) { dnssec_log(zone, ISC_LOG_DEBUG(3), "Creating parent NS fetch in " "nsfetch_continue()"); } - isc_async_run(zone->loop, dns_zonefetch_run, fetch); UNLOCK_ZONE(zone); #ifdef ENABLE_AFL } @@ -21303,7 +21295,6 @@ zone_checkds(dns_zone_t *zone) { #endif /* ifdef ENABLE_AFL */ dns_zonefetch_t *fetch = NULL; dns_nsfetch_t *nsfetch = NULL; - dns_name_t *name = NULL; fetch = isc_mem_get(zone->mctx, sizeof(dns_zonefetch_t)); *fetch = (dns_zonefetch_t){ @@ -21324,22 +21315,18 @@ zone_checkds(dns_zone_t *zone) { LOCK_ZONE(zone); zone->fetchcount[ZONEFETCHTYPE_NS]++; - isc_refcount_increment0(&zone->irefs); - name = dns_fixedname_initname(&fetch->name); - dns_name_dup(&zone->origin, zone->mctx, name); - dns_rdataset_init(&fetch->rrset); - dns_rdataset_init(&fetch->sigset); nsfetch = &fetch->fetchdata.nsfetch; dns_name_init(&nsfetch->pname); dns_name_clone(&zone->origin, &nsfetch->pname); + dns_zonefetch_schedule(fetch, &zone->origin); + if (isc_log_wouldlog(ISC_LOG_DEBUG(3))) { dnssec_log( zone, ISC_LOG_DEBUG(3), "Creating parent NS fetch in zone_checkds()"); } - isc_async_run(zone->loop, dns_zonefetch_run, fetch); UNLOCK_ZONE(zone); #ifdef ENABLE_AFL } diff --git a/lib/dns/zonefetch.c b/lib/dns/zonefetch.c index ea3fa3099ce..c58cae51837 100644 --- a/lib/dns/zonefetch.c +++ b/lib/dns/zonefetch.c @@ -13,6 +13,7 @@ /*! \file */ +#include #include #include @@ -188,6 +189,38 @@ cleanup: } } +static void +zonefetch_schedule(dns_zonefetch_t *fetch, dns_name_t *name) { + dns_zone_t *zone = fetch->zone; + + isc_refcount_increment0(dns__zone_irefs(zone)); + + if (name != NULL) { + dns_name_t *fname = dns_fixedname_initname(&fetch->name); + dns_name_dup(name, fetch->mctx, fname); + } + + dns_rdataset_init(&fetch->rrset); + dns_rdataset_init(&fetch->sigset); + + isc_async_run(dns_zone_getloop(zone), dns_zonefetch_run, fetch); +} + +void +dns_zonefetch_schedule(dns_zonefetch_t *fetch, dns_name_t *name) { + REQUIRE(fetch != NULL); + REQUIRE(name != NULL); + + zonefetch_schedule(fetch, name); +} + +void +dns_zonefetch_reschedule(dns_zonefetch_t *fetch) { + REQUIRE(fetch != NULL); + + zonefetch_schedule(fetch, NULL); +} + isc_result_t dns_zonefetch_verify(dns_zonefetch_t *fetch, isc_result_t eresult, dns_trust_t trust) {