4552. [bug] Named could trigger a assertion when sending notify

messages. [RT #44019]

(cherry picked from commit 7b9e28f1a5)
This commit is contained in:
Mark Andrews 2017-01-12 14:12:05 +11:00
parent da671124ad
commit ff963a5d93
4 changed files with 12 additions and 6 deletions

View file

@ -1,3 +1,6 @@
4552. [bug] Named could trigger a assertion when sending notify
messages. [RT #44019]
4551. [test] Add system tests for integrity checks of MX and
SRV records. [RT #43953]

View file

@ -41,7 +41,8 @@ typedef void (*isc_eventdestructor_t)(isc_event_t *);
void * ev_sender; \
isc_eventdestructor_t ev_destroy; \
void * ev_destroy_arg; \
ISC_LINK(ltype) ev_link
ISC_LINK(ltype) ev_link; \
ISC_LINK(ltype) ev_ratelink;
/*%
* Attributes matching a mask of 0x000000ff are reserved for the task library's
@ -71,6 +72,7 @@ do { \
(event)->ev_destroy = (df); \
(event)->ev_destroy_arg = (da); \
ISC_LINK_INIT((event), ev_link); \
ISC_LINK_INIT((event), ev_ratelink); \
} while (0)
/*%

View file

@ -155,7 +155,7 @@ isc_ratelimiter_enqueue(isc_ratelimiter_t *rl, isc_task_t *task,
rl->state == isc_ratelimiter_stalled) {
ev->ev_sender = task;
*eventp = NULL;
ISC_LIST_APPEND(rl->pending, ev, ev_link);
ISC_LIST_APPEND(rl->pending, ev, ev_ratelink);
} else if (rl->state == isc_ratelimiter_idle) {
result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL,
&rl->interval, ISC_FALSE);
@ -181,8 +181,8 @@ isc_ratelimiter_dequeue(isc_ratelimiter_t *rl, isc_event_t *event) {
REQUIRE(event != NULL);
LOCK(&rl->lock);
if (ISC_LINK_LINKED(event, ev_link)) {
ISC_LIST_UNLINK(rl->pending, event, ev_link);
if (ISC_LINK_LINKED(event, ev_ratelink)) {
ISC_LIST_UNLINK(rl->pending, event, ev_ratelink);
event->ev_sender = NULL;
} else
result = ISC_R_NOTFOUND;
@ -210,7 +210,7 @@ ratelimiter_tick(isc_task_t *task, isc_event_t *event) {
/*
* There is work to do. Let's do it after unlocking.
*/
ISC_LIST_UNLINK(rl->pending, p, ev_link);
ISC_LIST_UNLINK(rl->pending, p, ev_ratelink);
} else {
/*
* No work left to do. Stop the timer so that we don't
@ -244,7 +244,7 @@ isc_ratelimiter_shutdown(isc_ratelimiter_t *rl) {
(void)isc_timer_reset(rl->timer, isc_timertype_inactive,
NULL, NULL, ISC_FALSE);
while ((ev = ISC_LIST_HEAD(rl->pending)) != NULL) {
ISC_LIST_UNLINK(rl->pending, ev, ev_link);
ISC_LIST_UNLINK(rl->pending, ev, ev_ratelink);
ev->ev_attributes |= ISC_EVENTATTR_CANCELED;
task = ev->ev_sender;
isc_task_send(task, &ev);

View file

@ -549,6 +549,7 @@ task_send(isc__task_t *task, isc_event_t **eventp) {
REQUIRE(event != NULL);
REQUIRE(event->ev_type > 0);
REQUIRE(task->state != task_state_done);
REQUIRE(!ISC_LINK_LINKED(event, ev_ratelink));
XTRACE("task_send");