]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Move dns_zone_setdb() to after the db is created.
authorMark Andrews <marka@isc.org>
Wed, 4 Sep 2019 04:02:33 +0000 (14:02 +1000)
committerMark Andrews <marka@isc.org>
Tue, 24 Sep 2019 00:45:24 +0000 (10:45 +1000)
Addresses the database changing w/o the changes being done under task lock.
Fix: build the database before assigning it to the zone.

bin/named/zoneconf.c

index a1abd359a93bdbd5dbb2ae87edfd8df0e5de79b8..29f654851ede0cb4e9e42d640ef9873ede61b54a 100644 (file)
@@ -549,7 +549,8 @@ configure_staticstub(const cfg_obj_t *zconfig, dns_zone_t *zone,
        RETERR(dns_db_create(mctx, dbtype, dns_zone_getorigin(zone),
                             dns_dbtype_stub, dns_zone_getclass(zone),
                             0, NULL, &db));
-       dns_zone_setdb(zone, db);
+
+       dns_rdataset_init(&rdataset);
 
        dns_rdatalist_init(&rdatalist_ns);
        rdatalist_ns.rdclass = dns_zone_getclass(zone);
@@ -571,23 +572,19 @@ configure_staticstub(const cfg_obj_t *zconfig, dns_zone_t *zone,
        result = cfg_map_get(zconfig, "server-addresses", &obj);
        if (result == ISC_R_SUCCESS) {
                INSIST(obj != NULL);
-               result = configure_staticstub_serveraddrs(obj, zone,
-                                                         &rdatalist_ns,
-                                                         &rdatalist_a,
-                                                         &rdatalist_aaaa);
-               if (result != ISC_R_SUCCESS)
-                       goto cleanup;
+               CHECK(configure_staticstub_serveraddrs(obj, zone,
+                                                      &rdatalist_ns,
+                                                      &rdatalist_a,
+                                                      &rdatalist_aaaa));
        }
 
        obj = NULL;
        result = cfg_map_get(zconfig, "server-names", &obj);
        if (result == ISC_R_SUCCESS) {
                INSIST(obj != NULL);
-               result = configure_staticstub_servernames(obj, zone,
-                                                         &rdatalist_ns,
-                                                         zname);
-               if (result != ISC_R_SUCCESS)
-                       goto cleanup;
+               CHECK(configure_staticstub_servernames(obj, zone,
+                                                      &rdatalist_ns,
+                                                      zname));
        }
 
        /*
@@ -608,34 +605,26 @@ configure_staticstub(const cfg_obj_t *zconfig, dns_zone_t *zone,
         * First open a new version for the add operation and get a pointer
         * to the apex node (all RRs are of the apex name).
         */
-       result = dns_db_newversion(db, &dbversion);
-       if (result != ISC_R_SUCCESS)
-               goto cleanup;
+       CHECK(dns_db_newversion(db, &dbversion));
+
        dns_name_init(&apexname, NULL);
        dns_name_clone(dns_zone_getorigin(zone), &apexname);
-       result = dns_db_findnode(db, &apexname, false, &apexnode);
-       if (result != ISC_R_SUCCESS)
-               goto cleanup;
+       CHECK(dns_db_findnode(db, &apexname, false, &apexnode));
 
        /* Add NS RRset */
-       dns_rdataset_init(&rdataset);
        RUNTIME_CHECK(dns_rdatalist_tordataset(&rdatalist_ns, &rdataset)
                      == ISC_R_SUCCESS);
-       result = dns_db_addrdataset(db, apexnode, dbversion, 0, &rdataset,
-                                   0, NULL);
+       CHECK(dns_db_addrdataset(db, apexnode, dbversion, 0, &rdataset,
+                                0, NULL));
        dns_rdataset_disassociate(&rdataset);
-       if (result != ISC_R_SUCCESS)
-               goto cleanup;
 
        /* Add glue A RRset, if any */
        if (!ISC_LIST_EMPTY(rdatalist_a.rdata)) {
                RUNTIME_CHECK(dns_rdatalist_tordataset(&rdatalist_a, &rdataset)
                              == ISC_R_SUCCESS);
-               result = dns_db_addrdataset(db, apexnode, dbversion, 0,
-                                           &rdataset, 0, NULL);
+               CHECK(dns_db_addrdataset(db, apexnode, dbversion, 0,
+                                        &rdataset, 0, NULL));
                dns_rdataset_disassociate(&rdataset);
-               if (result != ISC_R_SUCCESS)
-                       goto cleanup;
        }
 
        /* Add glue AAAA RRset, if any */
@@ -643,22 +632,29 @@ configure_staticstub(const cfg_obj_t *zconfig, dns_zone_t *zone,
                RUNTIME_CHECK(dns_rdatalist_tordataset(&rdatalist_aaaa,
                                                       &rdataset)
                              == ISC_R_SUCCESS);
-               result = dns_db_addrdataset(db, apexnode, dbversion, 0,
-                                           &rdataset, 0, NULL);
+               CHECK(dns_db_addrdataset(db, apexnode, dbversion, 0,
+                                        &rdataset, 0, NULL));
                dns_rdataset_disassociate(&rdataset);
-               if (result != ISC_R_SUCCESS)
-                       goto cleanup;
        }
 
+       dns_db_closeversion(db, &dbversion, true);
+       dns_zone_setdb(zone, db);
+
        result = ISC_R_SUCCESS;
 
   cleanup:
-       if (apexnode != NULL)
+       if (dns_rdataset_isassociated(&rdataset)) {
+               dns_rdataset_disassociate(&rdataset);
+       }
+       if (apexnode != NULL) {
                dns_db_detachnode(db, &apexnode);
-       if (dbversion != NULL)
-               dns_db_closeversion(db, &dbversion, true);
-       if (db != NULL)
+       }
+       if (dbversion != NULL) {
+               dns_db_closeversion(db, &dbversion, false);
+       }
+       if (db != NULL) {
                dns_db_detach(&db);
+       }
        for (i = 0; rdatalists[i] != NULL; i++) {
                while ((rdata = ISC_LIST_HEAD(rdatalists[i]->rdata)) != NULL) {
                        ISC_LIST_UNLINK(rdatalists[i]->rdata, rdata, link);