mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 22:45:39 +00:00
2254. [bug] timer.c:dispatch() failed to lock timer->lock
when reading timer->idle allowing it to see intermediate values as timer->idle was reset by isc_timer_touch(). [RT #17243]
This commit is contained in:
5
CHANGES
5
CHANGES
@@ -1,3 +1,8 @@
|
|||||||
|
2254. [bug] timer.c:dispatch() failed to lock timer->lock
|
||||||
|
when reading timer->idle allowing it to see
|
||||||
|
intermediate values as timer->idle was reset by
|
||||||
|
isc_timer_touch(). [RT #17243]
|
||||||
|
|
||||||
--- 9.5.0a7 released ---
|
--- 9.5.0a7 released ---
|
||||||
|
|
||||||
2253. [func] "max-cache-size" defaults to 32M.
|
2253. [func] "max-cache-size" defaults to 32M.
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: timer.c,v 1.80 2007/06/19 23:47:17 tbox Exp $ */
|
/* $Id: timer.c,v 1.81 2007/10/24 00:57:23 marka Exp $ */
|
||||||
|
|
||||||
/*! \file */
|
/*! \file */
|
||||||
|
|
||||||
@@ -581,6 +581,7 @@ dispatch(isc_timermgr_t *manager, isc_time_t *now) {
|
|||||||
isc_eventtype_t type = 0;
|
isc_eventtype_t type = 0;
|
||||||
isc_timer_t *timer;
|
isc_timer_t *timer;
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
|
isc_boolean_t idle;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* The caller must be holding the manager lock.
|
* The caller must be holding the manager lock.
|
||||||
@@ -612,23 +613,33 @@ dispatch(isc_timermgr_t *manager, isc_time_t *now) {
|
|||||||
type = ISC_TIMEREVENT_LIFE;
|
type = ISC_TIMEREVENT_LIFE;
|
||||||
post_event = ISC_TRUE;
|
post_event = ISC_TRUE;
|
||||||
need_schedule = ISC_FALSE;
|
need_schedule = ISC_FALSE;
|
||||||
} else if (!isc_time_isepoch(&timer->idle) &&
|
|
||||||
isc_time_compare(now,
|
|
||||||
&timer->idle) >= 0) {
|
|
||||||
type = ISC_TIMEREVENT_IDLE;
|
|
||||||
post_event = ISC_TRUE;
|
|
||||||
need_schedule = ISC_FALSE;
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
idle = ISC_FALSE;
|
||||||
* Idle timer has been touched; reschedule.
|
|
||||||
*/
|
LOCK(&timer->lock);
|
||||||
XTRACEID(isc_msgcat_get(isc_msgcat,
|
if (!isc_time_isepoch(&timer->idle) &&
|
||||||
ISC_MSGSET_TIMER,
|
isc_time_compare(now,
|
||||||
ISC_MSG_IDLERESCHED,
|
&timer->idle) >= 0) {
|
||||||
"idle reschedule"),
|
idle = ISC_TRUE;
|
||||||
timer);
|
}
|
||||||
post_event = ISC_FALSE;
|
UNLOCK(&timer->lock);
|
||||||
need_schedule = ISC_TRUE;
|
if (idle) {
|
||||||
|
type = ISC_TIMEREVENT_IDLE;
|
||||||
|
post_event = ISC_TRUE;
|
||||||
|
need_schedule = ISC_FALSE;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Idle timer has been touched;
|
||||||
|
* reschedule.
|
||||||
|
*/
|
||||||
|
XTRACEID(isc_msgcat_get(isc_msgcat,
|
||||||
|
ISC_MSGSET_TIMER,
|
||||||
|
ISC_MSG_IDLERESCHED,
|
||||||
|
"idle reschedule"),
|
||||||
|
timer);
|
||||||
|
post_event = ISC_FALSE;
|
||||||
|
need_schedule = ISC_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (post_event) {
|
if (post_event) {
|
||||||
|
Reference in New Issue
Block a user