Move dns_zone_setdb() to after the db is created.
Addresses the database changing w/o the changes being done under task lock. Fix: build the database before assigning it to the zone.
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user