From 6687217b8ff5825f5f39baab03d58950afa0293c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Tue, 14 May 2019 00:40:17 +0700 Subject: [PATCH] Protect global finished bool by making it atomic --- bin/dnssec/dnssec-signzone.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/bin/dnssec/dnssec-signzone.c b/bin/dnssec/dnssec-signzone.c index a2b01eb8e0..207cef6aba 100644 --- a/bin/dnssec/dnssec-signzone.c +++ b/bin/dnssec/dnssec-signzone.c @@ -156,7 +156,7 @@ static size_t salt_length = 0; static isc_task_t *master = NULL; static unsigned int ntasks = 0; static atomic_bool shuttingdown = ATOMIC_VAR_INIT(false); -static bool finished = false; +static atomic_bool finished = ATOMIC_VAR_INIT(false); static bool nokeys = false; static bool removefile = false; static bool generateds = false; @@ -1455,11 +1455,12 @@ signapex(void) { cleannode(gdb, gversion, node); dns_db_detachnode(gdb, &node); result = dns_dbiterator_first(gdbiter); - if (result == ISC_R_NOMORE) - finished = true; - else if (result != ISC_R_SUCCESS) + if (result == ISC_R_NOMORE) { + atomic_store(&finished, true); + } else if (result != ISC_R_SUCCESS) { fatal("failure iterating database: %s", isc_result_totext(result)); + } } /*% @@ -1484,7 +1485,7 @@ assignwork(isc_task_t *task, isc_task_t *worker) { } LOCK(&namelock); - if (finished) { + if (atomic_load(&finished)) { ended++; if (ended == ntasks) { isc_task_detach(&task); @@ -1554,7 +1555,7 @@ assignwork(isc_task_t *task, isc_task_t *worker) { next: result = dns_dbiterator_next(gdbiter); if (result == ISC_R_NOMORE) { - finished = true; + atomic_store(&finished, true); break; } else if (result != ISC_R_SUCCESS) fatal("failure iterating database: %s", @@ -3856,7 +3857,7 @@ main(int argc, char *argv[]) { presign(); TIME_NOW(&sign_start); signapex(); - if (!finished) { + if (!atomic_load(&finished)) { /* * There is more work to do. Spread it out over multiple * processors if possible. @@ -3869,8 +3870,9 @@ main(int argc, char *argv[]) { isc_result_totext(result)); } (void)isc_app_run(); - if (!finished) + if (!atomic_load(&finished)) { fatal("process aborted by user"); + } } else isc_task_detach(&master); atomic_store(&shuttingdown, true);;