diff --git a/CHANGES b/CHANGES index cb76287997..069e373ae2 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +5000. [bug] named_server_servestale() could leave the server in + exclusive mode if an error occured. [GL #441] + 4999. [cleanup] Remove custom printf implementaion in lib/isc/print.c. [GL #261] diff --git a/bin/named/server.c b/bin/named/server.c index c53c0c3e29..077ce463b1 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -14931,6 +14931,7 @@ named_server_servestale(named_server_t *server, isc_lex_t *lex, dns_stale_answer_t staleanswersok = dns_stale_answer_conf; isc_boolean_t wantstatus = ISC_FALSE; isc_result_t result = ISC_R_SUCCESS; + isc_boolean_t exclusive = ISC_FALSE; /* Skip the command name. */ ptr = next_token(lex, text); @@ -14982,6 +14983,7 @@ named_server_servestale(named_server_t *server, isc_lex_t *lex, result = isc_task_beginexclusive(server->task); RUNTIME_CHECK(result == ISC_R_SUCCESS); + exclusive = ISC_TRUE; for (view = ISC_LIST_HEAD(server->viewlist); view != NULL; @@ -15037,12 +15039,14 @@ named_server_servestale(named_server_t *server, isc_lex_t *lex, } found = ISC_TRUE; } - isc_task_endexclusive(named_g_server->task); if (!found) result = ISC_R_NOTFOUND; cleanup: + if (exclusive) + isc_task_endexclusive(named_g_server->task); + if (isc_buffer_usedlength(*text) > 0) (void) putnull(text);