From: Mark Andrews Date: Fri, 27 Jul 2018 05:36:53 +0000 (+1000) Subject: named_server_servestale could leave the server in exclusive mode if a error occurs. X-Git-Tag: v9.13.3~92^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c8b07932e43d0f0b9f673b6fb21020875a0e8d27;p=thirdparty%2Fbind9.git named_server_servestale could leave the server in exclusive mode if a error occurs. --- diff --git a/CHANGES b/CHANGES index cb762879971..069e373ae23 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 c53c0c3e296..077ce463b19 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);