The dns_zone_getxfrintime() function fails to lock the zone before
accessing its 'xfrintime' structure member, which can cause a data
race between soa_query() and the statistics channel. Add the missing
locking/unlocking pair, like it's done in numerous other similar
functions.
*/
isc_time_t
-dns_zone_getxfrintime(const dns_zone_t *zone);
+dns_zone_getxfrintime(dns_zone_t *zone);
/*%<
* Get the start time of the zone's latest major step before an incoming zone
* transfer is initiated. The time is set to the current time before the
}
isc_time_t
-dns_zone_getxfrintime(const dns_zone_t *zone) {
+dns_zone_getxfrintime(dns_zone_t *zone) {
+ isc_time_t xfrintime;
+
REQUIRE(DNS_ZONE_VALID(zone));
- return (zone->xfrintime);
+ LOCK_ZONE(zone);
+ xfrintime = zone->xfrintime;
+ UNLOCK_ZONE(zone);
+
+ return (xfrintime);
}
static void