mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-02 15:45:25 +00:00
yet another shutdown race condition
This commit is contained in:
@@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: nsupdate.c,v 1.90 2001/04/13 00:45:19 bwelling Exp $ */
|
/* $Id: nsupdate.c,v 1.91 2001/04/13 01:32:14 bwelling Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
@@ -129,6 +129,7 @@ static FILE *input;
|
|||||||
static isc_boolean_t interactive = ISC_TRUE;
|
static isc_boolean_t interactive = ISC_TRUE;
|
||||||
static isc_boolean_t seenerror = ISC_FALSE;
|
static isc_boolean_t seenerror = ISC_FALSE;
|
||||||
static const dns_master_style_t *style = &dns_master_style_debug;
|
static const dns_master_style_t *style = &dns_master_style_debug;
|
||||||
|
static int requests = 0;
|
||||||
|
|
||||||
typedef struct nsu_requestinfo {
|
typedef struct nsu_requestinfo {
|
||||||
dns_message_t *msg;
|
dns_message_t *msg;
|
||||||
@@ -357,14 +358,8 @@ setup_key(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shutdown_program(isc_task_t *task, isc_event_t *event) {
|
doshutdown(void) {
|
||||||
REQUIRE(task == global_task);
|
|
||||||
UNUSED(task);
|
|
||||||
|
|
||||||
ddebug("shutdown_program()");
|
|
||||||
isc_event_free(&event);
|
|
||||||
isc_task_detach(&global_task);
|
isc_task_detach(&global_task);
|
||||||
shuttingdown = ISC_TRUE;
|
|
||||||
|
|
||||||
if (userserver != NULL)
|
if (userserver != NULL)
|
||||||
isc_mem_put(mctx, userserver, sizeof(isc_sockaddr_t));
|
isc_mem_put(mctx, userserver, sizeof(isc_sockaddr_t));
|
||||||
@@ -396,8 +391,7 @@ shutdown_program(isc_task_t *task, isc_event_t *event) {
|
|||||||
|
|
||||||
isc_mem_put(mctx, servers, ns_total * sizeof(isc_sockaddr_t));
|
isc_mem_put(mctx, servers, ns_total * sizeof(isc_sockaddr_t));
|
||||||
|
|
||||||
ddebug("Shutting down request manager");
|
ddebug("Destroying request manager");
|
||||||
dns_requestmgr_shutdown(requestmgr);
|
|
||||||
dns_requestmgr_detach(&requestmgr);
|
dns_requestmgr_detach(&requestmgr);
|
||||||
|
|
||||||
ddebug("Freeing the dispatchers");
|
ddebug("Freeing the dispatchers");
|
||||||
@@ -411,6 +405,29 @@ shutdown_program(isc_task_t *task, isc_event_t *event) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
maybeshutdown(void) {
|
||||||
|
ddebug("Shutting down request manager");
|
||||||
|
dns_requestmgr_shutdown(requestmgr);
|
||||||
|
|
||||||
|
if (requests != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
doshutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
shutdown_program(isc_task_t *task, isc_event_t *event) {
|
||||||
|
REQUIRE(task == global_task);
|
||||||
|
UNUSED(task);
|
||||||
|
|
||||||
|
ddebug("shutdown_program()");
|
||||||
|
isc_event_free(&event);
|
||||||
|
|
||||||
|
shuttingdown = ISC_TRUE;
|
||||||
|
maybeshutdown();
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup_system(void) {
|
setup_system(void) {
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
@@ -1312,6 +1329,8 @@ update_completed(isc_task_t *task, isc_event_t *event) {
|
|||||||
|
|
||||||
ddebug("update_completed()");
|
ddebug("update_completed()");
|
||||||
|
|
||||||
|
requests--;
|
||||||
|
|
||||||
REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
|
REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
|
||||||
reqev = (dns_requestevent_t *)event;
|
reqev = (dns_requestevent_t *)event;
|
||||||
request = reqev->request;
|
request = reqev->request;
|
||||||
@@ -1319,6 +1338,7 @@ update_completed(isc_task_t *task, isc_event_t *event) {
|
|||||||
if (shuttingdown) {
|
if (shuttingdown) {
|
||||||
dns_request_destroy(&request);
|
dns_request_destroy(&request);
|
||||||
isc_event_free(&event);
|
isc_event_free(&event);
|
||||||
|
maybeshutdown();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1398,6 +1418,7 @@ send_update(dns_name_t *zonename, isc_sockaddr_t *master,
|
|||||||
FIND_TIMEOUT, global_task,
|
FIND_TIMEOUT, global_task,
|
||||||
update_completed, NULL, &request);
|
update_completed, NULL, &request);
|
||||||
check_result(result, "dns_request_createvia");
|
check_result(result, "dns_request_createvia");
|
||||||
|
requests++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1423,6 +1444,9 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
|
|||||||
UNUSED(task);
|
UNUSED(task);
|
||||||
|
|
||||||
ddebug("recvsoa()");
|
ddebug("recvsoa()");
|
||||||
|
|
||||||
|
requests--;
|
||||||
|
|
||||||
REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
|
REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
|
||||||
reqev = (dns_requestevent_t *)event;
|
reqev = (dns_requestevent_t *)event;
|
||||||
request = reqev->request;
|
request = reqev->request;
|
||||||
@@ -1436,6 +1460,7 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
|
|||||||
dns_message_destroy(&soaquery);
|
dns_message_destroy(&soaquery);
|
||||||
isc_mem_put(mctx, reqinfo, sizeof(nsu_requestinfo_t));
|
isc_mem_put(mctx, reqinfo, sizeof(nsu_requestinfo_t));
|
||||||
isc_event_free(&event);
|
isc_event_free(&event);
|
||||||
|
maybeshutdown();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1633,6 +1658,7 @@ sendrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
|
|||||||
0, NULL, FIND_TIMEOUT, global_task,
|
0, NULL, FIND_TIMEOUT, global_task,
|
||||||
recvsoa, reqinfo, request);
|
recvsoa, reqinfo, request);
|
||||||
check_result(result, "dns_request_createvia");
|
check_result(result, "dns_request_createvia");
|
||||||
|
requests++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1717,16 +1743,14 @@ getinput(isc_task_t *task, isc_event_t *event) {
|
|||||||
|
|
||||||
UNUSED(task);
|
UNUSED(task);
|
||||||
|
|
||||||
if (shuttingdown)
|
if (shuttingdown) {
|
||||||
|
maybeshutdown();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (global_event == NULL)
|
if (global_event == NULL)
|
||||||
global_event = event;
|
global_event = event;
|
||||||
|
|
||||||
if (shuttingdown) {
|
|
||||||
isc_app_shutdown();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
reset_system();
|
reset_system();
|
||||||
more = user_interaction();
|
more = user_interaction();
|
||||||
if (!more) {
|
if (!more) {
|
||||||
|
Reference in New Issue
Block a user