Skip to content
  • Michał Kępień's avatar
    Prevent a race after zone load · 56003e9f
    Michał Kępień authored and Evan Hunt's avatar Evan Hunt committed
    Zone loading happens in a different task (zone->loadtask) than other
    zone actions (zone->task).  Thus, when zone_postload() is called in the
    context of zone->loadtask, it may cause zone maintenance to be queued in
    zone->task and another thread can then execute zone_maintenance() before
    zone_postload() gets a chance to finish its work in the first thread.
    This would not be a problem if zone_maintenance() accounted for this
    possibility by locking the zone before checking the state of its
    DNS_ZONEFLG_LOADPENDING flag.  However, the zone is currently not locked
    before the state of that flag is checked, which may prevent zone
    maintenance from happening despite zone_postload() scheduling it.  Fix
    by locking the zone in zone_maintenance() before checking the state of
    the zone's DNS_ZONEFLG_LOADPENDING flag.
    56003e9f