]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
make sure new_zone_lock is locked before unlocking it
authorEvan Hunt <each@isc.org>
Sun, 12 Jul 2020 04:30:53 +0000 (21:30 -0700)
committerEvan Hunt <each@isc.org>
Mon, 13 Jul 2020 19:32:51 +0000 (12:32 -0700)
it was possible for the count_newzones() function to try to
unlock view->new_zone_lock on return before locking it, which
caused a crash on shutdown.

(cherry picked from commit ed37c63e2bbc4afe299dbe38ae98871dcc1d3470)

bin/named/server.c

index 4df714e527b145c0b7bfc40a13b840c9aaa7d0dd..e752aa71a99fc382d97f6b4c1d70aada574fed3b 100644 (file)
@@ -6789,6 +6789,8 @@ count_newzones(dns_view_t *view, ns_cfgctx_t *nzcfg, int *num_zonesp) {
 
        REQUIRE(num_zonesp != NULL);
 
+       LOCK(&view->new_zone_lock);
+
        CHECK(migrate_nzf(view));
 
        isc_log_write(ns_g_lctx,
@@ -6797,8 +6799,6 @@ count_newzones(dns_view_t *view, ns_cfgctx_t *nzcfg, int *num_zonesp) {
                      "for view '%s'",
                      view->new_zone_db, view->name);
 
-       LOCK(&view->new_zone_lock);
-
        CHECK(nzd_count(view, &n));
 
        *num_zonesp = n;
@@ -12006,6 +12006,10 @@ nzd_count(dns_view_t *view, int *countp) {
        return (result);
 }
 
+/*
+ * Migrate zone configuration from an NZF file to an NZD database.
+ * Caller must hold view->new_zone_lock.
+ */
 static isc_result_t
 migrate_nzf(dns_view_t *view) {
        isc_result_t result;
@@ -12021,8 +12025,6 @@ migrate_nzf(dns_view_t *view) {
        MDB_val key, data;
        ns_dzarg_t dzarg;
 
-       LOCK(&view->new_zone_lock);
-
        /*
         * If NZF file doesn't exist, or NZD DB exists and already
         * has data, return without attempting migration.
@@ -12166,8 +12168,6 @@ migrate_nzf(dns_view_t *view) {
                result = nzd_close(&txn, commit);
        }
 
-       UNLOCK(&view->new_zone_lock);
-
        if (text != NULL) {
                isc_buffer_free(&text);
        }