diff --git a/CHANGES b/CHANGES index 7611fdb11a..2d3bb9cad0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4563. [bug] Modified zones would occasionally fail to reload. + [RT #39424] + 4561. [port] Silence a warning in strict C99 compilers. [RT #44414] 4560. [bug] mdig: add -m option to enable memory debugging rather diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 9d4191616b..29f34e29c9 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -1828,7 +1828,6 @@ zone_touched(dns_zone_t *zone) { return (ISC_TRUE); } - return (ISC_FALSE); } @@ -1908,6 +1907,8 @@ zone_load(dns_zone_t *zone, unsigned int flags, isc_boolean_t locked) { * been loaded yet, zone->loadtime will be the epoch. */ if (zone->masterfile != NULL) { + isc_time_t filetime; + /* * The file is already loaded. If we are just doing a * "rndc reconfig", we are done. @@ -1927,6 +1928,16 @@ zone_load(dns_zone_t *zone, unsigned int flags, isc_boolean_t locked) { result = DNS_R_UPTODATE; goto cleanup; } + + + /* + * If the file modification time is in the past + * set loadtime to that value. + */ + result = isc_file_getmodtime(zone->masterfile, &filetime); + if (result == ISC_R_SUCCESS && + isc_time_compare(&loadtime, &filetime) > 0) + loadtime = filetime; } /*