From 7d89e40ea078e4790dd00a50ee9ac4442ff4ea92 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 6 Sep 2019 15:34:38 +1000 Subject: [PATCH] Queue nsec3param setting until receive_secure_serial has completed. (cherry picked from commit 456888c00fe5a9109bb9710724d8a4056b8f04a5) --- lib/dns/zone.c | 67 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 2ccd8ff2cd..3f4c9e1aef 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -434,6 +434,7 @@ struct dns_zone { */ dns_diff_t rss_diff; isc_eventlist_t rss_events; + isc_eventlist_t rss_post; dns_dbversion_t *rss_newver; dns_dbversion_t *rss_oldver; dns_db_t *rss_db; @@ -806,6 +807,7 @@ static isc_result_t zonemgr_getio(dns_zonemgr_t *zmgr, bool high, void *arg, dns_io_t **iop); static void zonemgr_putio(dns_io_t **iop); static void zonemgr_cancelio(dns_io_t *io); +static void rss_post(dns_zone_t *, isc_event_t *); static isc_result_t zone_get_from_db(dns_zone_t *zone, dns_db_t *db, unsigned int *nscount, @@ -1069,6 +1071,7 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) { zone->requestixfr = true; zone->requestexpire = true; ISC_LIST_INIT(zone->rss_events); + ISC_LIST_INIT(zone->rss_post); zone->rss_db = NULL; zone->rss_raw = NULL; zone->rss_newver = NULL; @@ -1116,7 +1119,7 @@ zone_free(dns_zone_t *zone) { isc_mem_t *mctx = NULL; dns_signing_t *signing; dns_nsec3chain_t *nsec3chain; - isc_event_t *setnsec3param_event; + isc_event_t *event; dns_include_t *include; REQUIRE(DNS_ZONE_VALID(zone)); @@ -1151,10 +1154,14 @@ zone_free(dns_zone_t *zone) { /* Unmanaged objects */ while (!ISC_LIST_EMPTY(zone->setnsec3param_queue)) { - setnsec3param_event = ISC_LIST_HEAD(zone->setnsec3param_queue); - ISC_LIST_UNLINK(zone->setnsec3param_queue, setnsec3param_event, - ev_link); - isc_event_free(&setnsec3param_event); + event = ISC_LIST_HEAD(zone->setnsec3param_queue); + ISC_LIST_UNLINK(zone->setnsec3param_queue, event, ev_link); + isc_event_free(&event); + } + while (!ISC_LIST_EMPTY(zone->rss_post)) { + event = ISC_LIST_HEAD(zone->setnsec3param_queue); + ISC_LIST_UNLINK(zone->rss_post, event, ev_link); + isc_event_free(&event); } for (signing = ISC_LIST_HEAD(zone->signing); signing != NULL; @@ -14569,6 +14576,14 @@ receive_secure_serial(isc_task_t *task, isc_event_t *event) { ISC_LIST_UNLINK(zone->rss_events, event, ev_link); goto nextevent; } + + event = ISC_LIST_HEAD(zone->rss_post); + while (event != NULL) { + ISC_LIST_UNLINK(zone->rss_post, event, ev_link); + rss_post(zone, event); + event = ISC_LIST_HEAD(zone->rss_post); + } + dns_zone_idetach(&zone); } @@ -18996,19 +19011,47 @@ dns_zone_keydone(dns_zone_t *zone, const char *keystr) { /* * Called from the zone task's queue after the relevant event is posted by * dns_zone_setnsec3param(). - * + */ +static void +setnsec3param(isc_task_t *task, isc_event_t *event) { + const char *me = "setnsec3param"; + dns_zone_t *zone = event->ev_arg; + + INSIST(DNS_ZONE_VALID(zone)); + + UNUSED(task); + + ENTER; + + /* + * If receive_secure_serial is still processing or we have a + * queued event append rss_post queue. + */ + if (zone->rss_newver != NULL || + ISC_LIST_HEAD(zone->rss_post) != NULL) + { + /* + * Wait for receive_secure_serial() to finish processing. + */ + ISC_LIST_APPEND(zone->rss_post, event, ev_link); + } else { + rss_post(zone, event); + } + dns_zone_idetach(&zone); +} + +/* * Check whether NSEC3 chain addition or removal specified by the private-type * record passed with the event was already queued (or even fully performed). * If not, modify the relevant private-type records at the zone apex and call * resume_addnsec3chain(). */ static void -setnsec3param(isc_task_t *task, isc_event_t *event) { - const char *me = "setnsec3param"; +rss_post(dns_zone_t *zone, isc_event_t *event) { + const char *me = "rss_post"; bool commit = false; isc_result_t result; dns_dbversion_t *oldver = NULL, *newver = NULL; - dns_zone_t *zone; dns_db_t *db = NULL; dns_dbnode_t *node = NULL; dns_rdataset_t prdataset, nrdataset; @@ -19020,11 +19063,6 @@ setnsec3param(isc_task_t *task, isc_event_t *event) { bool nseconly; bool exists = false; - UNUSED(task); - - zone = event->ev_arg; - INSIST(DNS_ZONE_VALID(zone)); - ENTER; np = &npe->params; @@ -19180,7 +19218,6 @@ setnsec3param(isc_task_t *task, isc_event_t *event) { } dns_diff_clear(&diff); isc_event_free(&event); - dns_zone_idetach(&zone); INSIST(oldver == NULL); INSIST(newver == NULL);