mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 22:45:39 +00:00
Fix a race in RPZ with min-update-interval set to 0
If another RPZ update is pending when processing the previous one nears completion and min-update-interval is set to 0, isc_timer_reset() gets called with 'interval' set to 0, which triggers an assertion failure. To prevent such a scenario from causing a crash, queue the update event directly instead of asking the timer thread to do it.
This commit is contained in:
6
CHANGES
6
CHANGES
@@ -1,3 +1,9 @@
|
||||
5069. [bug] Fix a hang on in RPZ when named is shutdown during RPZ
|
||||
zone update. [GL !907]
|
||||
|
||||
5068. [bug] Fix a race in RPZ with min-update-interval set to 0.
|
||||
[GL #643]
|
||||
|
||||
5067. [bug] Don't minimize qname when sending the query
|
||||
to a forwarder. [GL #361]
|
||||
|
||||
|
@@ -1802,6 +1802,7 @@ finish_update(dns_rpz_zone_t *rpz) {
|
||||
* If there's an update pending schedule it
|
||||
*/
|
||||
if (rpz->updatepending == true) {
|
||||
if (rpz->min_update_interval > 0) {
|
||||
uint64_t defer = rpz->min_update_interval;
|
||||
isc_interval_t interval;
|
||||
dns_name_format(&rpz->origin, dname,
|
||||
@@ -1814,6 +1815,17 @@ finish_update(dns_rpz_zone_t *rpz) {
|
||||
isc_interval_set(&interval, (unsigned int)defer, 0);
|
||||
isc_timer_reset(rpz->updatetimer, isc_timertype_once,
|
||||
NULL, &interval, true);
|
||||
} else {
|
||||
isc_event_t *event;
|
||||
INSIST(!ISC_LINK_LINKED(&rpz->updateevent, ev_link));
|
||||
ISC_EVENT_INIT(&rpz->updateevent,
|
||||
sizeof(rpz->updateevent), 0, NULL,
|
||||
DNS_EVENT_RPZUPDATED,
|
||||
dns_rpz_update_taskaction,
|
||||
rpz, rpz, NULL, NULL);
|
||||
event = &rpz->updateevent;
|
||||
isc_task_send(rpz->rpzs->updater, &event);
|
||||
}
|
||||
}
|
||||
UNLOCK(&rpz->rpzs->maint_lock);
|
||||
|
||||
|
Reference in New Issue
Block a user