2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 05:57:52 +00:00

Fix task timing race in setnsec3param()

When setnsec3param() is schedule from zone_postload() there's no
guarantee that `zone->db` is not `NULL` yet.  Thus when the
setnsec3param() is called, we need to check for `zone->db` existence and
reschedule the task, because calling `rss_post()` on a zone with empty
`.db` ends up with no-op (the function just returns).
This commit is contained in:
Ondřej Surý 2021-04-19 09:25:14 +02:00
parent c216ace42a
commit 0127ba6472

View File

@ -21119,6 +21119,22 @@ setnsec3param(isc_task_t *task, isc_event_t *event) {
*/
ISC_LIST_APPEND(zone->rss_post, event, ev_link);
} else {
bool rescheduled = false;
ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
/*
* The zone is not yet fully loaded. Reschedule the event to
* be picked up later. This turns this function into a busy
* wait, but it only happens at startup.
*/
if (zone->db == NULL) {
rescheduled = true;
isc_task_send(task, &event);
}
ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_read);
if (rescheduled) {
return;
}
rss_post(zone, event);
}
dns_zone_idetach(&zone);