]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Set the modification time of the zone file after dumping
authorMark Andrews <marka@isc.org>
Tue, 4 Jul 2023 01:57:56 +0000 (11:57 +1000)
committerMark Andrews <marka@isc.org>
Thu, 31 Aug 2023 01:34:14 +0000 (11:34 +1000)
For secondary, mirror and redirect zones the expiry time is set
from the zone file's modification time on restart.  As zone dumping
take time, set the modification time of the zone file to the expire
time less the expire interval.

lib/dns/zone.c

index 64064a415725094c75fe34827997414056c84ca3..d46349090829076c3f3b8c92cd21237c43314549 100644 (file)
@@ -11390,6 +11390,27 @@ dump_done(void *arg, isc_result_t result) {
 
        ENTER;
 
+       /*
+        * Adjust modification time of zone file to preserve expire timing.
+        */
+       if ((zone->type == dns_zone_secondary ||
+            zone->type == dns_zone_mirror ||
+            zone->type == dns_zone_redirect) &&
+           result == ISC_R_SUCCESS)
+       {
+               LOCK_ZONE(zone);
+               isc_time_t when;
+               isc_interval_t i;
+               isc_interval_set(&i, zone->expire, 0);
+               result = isc_time_subtract(&zone->expiretime, &i, &when);
+               if (result == ISC_R_SUCCESS) {
+                       (void)isc_file_settime(zone->masterfile, &when);
+               } else {
+                       result = ISC_R_SUCCESS;
+               }
+               UNLOCK_ZONE(zone);
+       }
+
        if (result == ISC_R_SUCCESS && zone->journal != NULL) {
                /*
                 * We don't own these, zone->dctx must stay valid.
@@ -11573,6 +11594,22 @@ redo:
        } else {
                result = dns_master_dump(zone->mctx, db, version, masterstyle,
                                         masterfile, masterformat, &rawdata);
+               if ((zone->type == dns_zone_secondary ||
+                    zone->type == dns_zone_mirror ||
+                    zone->type == dns_zone_redirect) &&
+                   result == ISC_R_SUCCESS)
+               {
+                       isc_time_t when;
+                       isc_interval_t i;
+                       isc_interval_set(&i, zone->expire, 0);
+                       result = isc_time_subtract(&zone->expiretime, &i,
+                                                  &when);
+                       if (result == ISC_R_SUCCESS) {
+                               (void)isc_file_settime(zone->masterfile, &when);
+                       } else {
+                               result = ISC_R_SUCCESS;
+                       }
+               }
        }
 fail:
        if (version != NULL) {