From: Michał Kępień Date: Thu, 15 Feb 2018 19:31:54 +0000 (+0100) Subject: Do not recheck DNS_ZONEFLG_LOADPENDING in zone_asyncload() X-Git-Tag: v9.12.1rc1~4^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=840c9348bfaf2de03423dece1ec1493a26d71e30;p=thirdparty%2Fbind9.git Do not recheck DNS_ZONEFLG_LOADPENDING in zone_asyncload() Remove a block of code which dates back to commit 8a2ab2b9203, when dns_zone_asyncload() did not yet check DNS_ZONEFLG_LOADPENDING. Currently, no race in accessing DNS_ZONEFLG_LOADPENDING is possible any more, because: - dns_zone_asyncload() is still the only function which may queue zone_asyncload(), - dns_zone_asyncload() accesses DNS_ZONEFLG_LOADPENDING under a lock (and potentially queues an event under the same lock), - DNS_ZONEFLG_LOADPENDING is not cleared until the load actually completes. Thus, the rechecking code can be safely removed from zone_asyncload(). Note that this also brings zone_asyncload() to a state in which the completion callback is always invoked. This is required to prevent leaking memory in case something goes wrong in zone_asyncload() and a zone table the zone belongs to is indefinitely left with a positive reference count. --- diff --git a/lib/dns/zone.c b/lib/dns/zone.c index c4147d19af7..fe3aa71a850 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -2169,7 +2169,6 @@ zone_asyncload(isc_task_t *task, isc_event_t *event) { dns_asyncload_t *asl = event->ev_arg; dns_zone_t *zone = asl->zone; isc_result_t result; - isc_boolean_t load_pending; UNUSED(task); @@ -2177,17 +2176,8 @@ zone_asyncload(isc_task_t *task, isc_event_t *event) { isc_event_free(&event); - /* Make sure load is still pending */ LOCK_ZONE(zone); - load_pending = ISC_TF(DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADPENDING)); - - if (!load_pending) { - UNLOCK_ZONE(zone); - goto cleanup; - } - result = zone_load(zone, 0, ISC_TRUE); - if (result != DNS_R_CONTINUE) { DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_LOADPENDING); } @@ -2197,7 +2187,6 @@ zone_asyncload(isc_task_t *task, isc_event_t *event) { if (asl->loaded != NULL) (asl->loaded)(asl->loaded_arg, zone, task); - cleanup: isc_mem_put(zone->mctx, asl, sizeof (*asl)); dns_zone_idetach(&zone); }