]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix a few broken atomics initializations
authorWitold Kręcicki <wpk@isc.org>
Mon, 8 Jul 2019 15:30:06 +0000 (17:30 +0200)
committerWitold Kręcicki <wpk@isc.org>
Tue, 9 Jul 2019 14:11:14 +0000 (16:11 +0200)
bin/dnssec/dnssec-signzone.c
lib/dns/lib.c
lib/dns/resolver.c
lib/dns/zone.c
lib/isc/task.c

index e518ab3720b19b1f632a909f877278811d91dfd5..b01d15b58ce5a216ef6a5d3dee13c0616fdafe9c 100644 (file)
@@ -156,8 +156,8 @@ static unsigned char *gsalt = saltbuf;
 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 atomic_bool finished = ATOMIC_VAR_INIT(false);
+static atomic_bool shuttingdown;
+static atomic_bool finished;
 static bool nokeys = false;
 static bool removefile = false;
 static bool generateds = false;
@@ -3216,6 +3216,9 @@ main(int argc, char *argv[]) {
        bool set_iter = false;
        bool nonsecify = false;
 
+       atomic_init(&shuttingdown, false);
+       atomic_init(&finished, false);
+
        /* Unused letters: Bb G J q Yy (and F is reserved). */
 #define CMDLINE_FLAGS \
        "3:AaCc:Dd:E:e:f:FghH:i:I:j:K:k:L:l:m:M:n:N:o:O:PpQRr:s:ST:tuUv:VX:xzZ:"
index 8d51a0a762e21b1abd217e7576eafc759f42a158..e2b92a99d7062a7c5a5e8bca305ff15bbd4a88ea 100644 (file)
@@ -44,7 +44,7 @@ static isc_once_t init_once = ISC_ONCE_INIT;
 static isc_mem_t *dns_g_mctx = NULL;
 static dns_dbimplementation_t *dbimp = NULL;
 static bool initialize_done = false;
-static isc_refcount_t references = 0;
+static isc_refcount_t references;
 
 static void
 initialize(void) {
@@ -52,6 +52,8 @@ initialize(void) {
 
        REQUIRE(initialize_done == false);
 
+       isc_refcount_init(&references, 0);
+
        result = isc_mem_create(0, 0, &dns_g_mctx);
        if (result != ISC_R_SUCCESS)
                return;
index 2af562a5cc9b9108ab2268aadb7ed39f6b1e87fe..37efaa3af6a6a5192f20cdee296c56cdc40652bc 100644 (file)
@@ -9814,7 +9814,7 @@ destroy(dns_resolver_t *res) {
        unsigned int i;
        alternate_t *a;
 
-       REQUIRE(res->references == 0);
+       REQUIRE(atomic_load(&res->references) == 0);
        REQUIRE(!res->priming);
        REQUIRE(res->primefetch == NULL);
 
@@ -10039,7 +10039,7 @@ dns_resolver_create(dns_view_t *view,
                isc_mem_setname(res->buckets[i].mctx, name, NULL);
                isc_task_setname(res->buckets[i].task, name, res);
                ISC_LIST_INIT(res->buckets[i].fctxs);
-               atomic_store_release(&res->buckets[i].exiting, false);
+               atomic_init(&res->buckets[i].exiting, false);
                buckets_created++;
        }
 
@@ -10362,7 +10362,7 @@ dns_resolver_shutdown(dns_resolver_t *res) {
                                dns_dispatchset_cancelall(res->dispatches6,
                                                          res->buckets[i].task);
                        }
-                       res->buckets[i].exiting = true;
+                       atomic_store(&res->buckets[i].exiting, true);
                        if (ISC_LIST_EMPTY(res->buckets[i].fctxs)) {
                                INSIST(res->activebuckets > 0);
                                res->activebuckets--;
@@ -10583,7 +10583,7 @@ dns_resolver_createfetch(dns_resolver_t *res, const dns_name_t *name,
        UNLOCK(&res->lock);
        LOCK(&res->buckets[bucketnum].lock);
 
-       if (res->buckets[bucketnum].exiting) {
+       if (atomic_load(&res->buckets[bucketnum].exiting)) {
                result = ISC_R_SHUTTINGDOWN;
                goto unlock;
        }
index 9706d9e2b28310c2796804a93211c590ba2ac92e..25c8fcfa2aa82ac91fb6341b444a2291543f2212 100644 (file)
@@ -17392,7 +17392,7 @@ dns_zonemgr_unreachable(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote,
 
        RWLOCK(&zmgr->urlock, isc_rwlocktype_read);
        for (i = 0; i < UNREACH_CACHE_SIZE; i++) {
-               if (zmgr->unreachable[i].expire >= seconds &&
+               if (atomic_load(&zmgr->unreachable[i].expire) >= seconds &&
                    isc_sockaddr_equal(&zmgr->unreachable[i].remote, remote) &&
                    isc_sockaddr_equal(&zmgr->unreachable[i].local, local)) {
                        atomic_store_relaxed(&zmgr->unreachable[i].last,
index f0446eafbe06ba21dfd8567a546bc6f75bd79adb..b97ba306b62113b064ad0849ddb844a1faa089df 100644 (file)
@@ -229,7 +229,7 @@ task_finished(isc__task_t *task) {
        REQUIRE(EMPTY(task->events));
        REQUIRE(task->nevents == 0);
        REQUIRE(EMPTY(task->on_shutdown));
-       REQUIRE(task->references == 0);
+       REQUIRE(atomic_load(&task->references) == 0);
        REQUIRE(task->state == task_state_done);
 
        XTRACE("task_finished");
@@ -1243,7 +1243,8 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid) {
                 * we're stuck.  Automatically drop privileges at that
                 * point and continue with the regular ready queue.
                 */
-               if (manager->mode != isc_taskmgrmode_normal &&
+               if (atomic_load_relaxed(&manager->mode) !=
+                   isc_taskmgrmode_normal &&
                    atomic_load_explicit(&manager->tasks_running,
                                         memory_order_acquire) == 0)
                {
@@ -1256,7 +1257,8 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid) {
                         * we'll end up in a deadlock over queue locks.
                         *
                         */
-                       if (manager->mode != isc_taskmgrmode_normal &&
+                       if (atomic_load(&manager->mode) !=
+                           isc_taskmgrmode_normal &&
                            atomic_load_explicit(&manager->tasks_running,
                                                 memory_order_acquire) == 0)
                        {
@@ -1360,10 +1362,10 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
        manager->queues = isc_mem_get(mctx, workers * sizeof(isc__taskqueue_t));
        RUNTIME_CHECK(manager->queues != NULL);
 
-       manager->tasks_running = 0;
-       manager->tasks_ready = 0;
-       manager->curq = 0;
-       manager->exiting = false;
+       atomic_init(&manager->tasks_running, 0);
+       atomic_init(&manager->tasks_ready, 0);
+       atomic_init(&manager->curq, 0);
+       atomic_init(&manager->exiting, false);
        manager->excl = NULL;
        manager->halted = 0;
        atomic_store_relaxed(&manager->exclusive_req, false);
@@ -1529,8 +1531,8 @@ void
 isc__taskmgr_resume(isc_taskmgr_t *manager0) {
        isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
        LOCK(&manager->halt_lock);
-       if (manager->pause_req) {
-               manager->pause_req = false;
+       if (atomic_load(&manager->pause_req)) {
+               atomic_store(&manager->pause_req, false);
                while (manager->halted > 0) {
                        BROADCAST(&manager->halt_cond);
                        WAIT(&manager->halt_cond, &manager->halt_lock);