]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Do not recheck DNS_ZONEFLG_LOADPENDING in zone_asyncload()
authorMichał Kępień <michal@isc.org>
Thu, 15 Feb 2018 19:31:54 +0000 (20:31 +0100)
committerMichał Kępień <michal@isc.org>
Fri, 16 Feb 2018 07:47:40 +0000 (08:47 +0100)
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.

lib/dns/zone.c

index c4147d19af76a428a324325e367adc1ebd813cf9..fe3aa71a85054e44e3d3a4af6567413f1c498682 100644 (file)
@@ -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);
 }