2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-22 10:10:06 +00:00

Decouple database and node lifetimes by adding node-specific vtables

All databases in the codebase follow the same structure: a database is
an associative container from DNS names to nodes, and each node is an
associative container from RR types to RR data.

Each database implementation (qpzone, qpcache, sdlz, builtin, dyndb) has
its own corresponding node type (qpznode, qpcnode, etc). However, some
code needs to work with nodes generically regardless of their specific
type - for example, to acquire locks, manage references, or
register/unregister slabs from the heap.

Currently, these generic node operations are implemented as methods in
the database vtable, which creates problematic coupling between database
and node lifetimes. If a node outlives its parent database, the node
destructor will destroy all RR data, and each RR data destructor will
try to unregister from heaps by calling a virtual function from the
database vtable. Since the database was already freed, this causes a
crash.

This commit breaks the coupling by standardizing the layout of all
database nodes, adding a dedicated vtable for node operations, and
moving node-specific methods from the database vtable to the node
vtable.
This commit is contained in:
Alessio Podda 2025-06-05 11:51:29 +02:00 committed by Evan Hunt
parent 4a8f77e483
commit ae6a34cbda
43 changed files with 564 additions and 589 deletions

View File

@ -257,7 +257,7 @@ static void
free_db(dns_db_t **dbp, dns_dbnode_t **nodep, dns_dbversion_t **versionp) { free_db(dns_db_t **dbp, dns_dbnode_t **nodep, dns_dbversion_t **versionp) {
if (*dbp != NULL) { if (*dbp != NULL) {
if (*nodep != NULL) { if (*nodep != NULL) {
dns_db_detachnode(*dbp, nodep); dns_db_detachnode(nodep);
} }
if (versionp != NULL && *versionp != NULL) { if (versionp != NULL && *versionp != NULL) {
dns_db_closeversion(*dbp, versionp, false); dns_db_closeversion(*dbp, versionp, false);

View File

@ -132,7 +132,7 @@ loadset(const char *filename, dns_rdataset_t *rdataset) {
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (db != NULL) { if (db != NULL) {
dns_db_detach(&db); dns_db_detach(&db);

View File

@ -135,7 +135,7 @@ loadset(const char *filename, dns_rdataset_t *rdataset) {
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (db != NULL) { if (db != NULL) {
dns_db_detach(&db); dns_db_detach(&db);

View File

@ -953,7 +953,7 @@ addnowildcardhash(hashlist_t *l,
result = dns_db_findnode(gdb, wild, false, &node); result = dns_db_findnode(gdb, wild, false, &node);
if (result == ISC_R_SUCCESS) { if (result == ISC_R_SUCCESS) {
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
return; return;
} }
@ -1031,7 +1031,7 @@ loadds(dns_name_t *name, uint32_t ttl, dns_rdataset_t *dsset) {
result = dns_db_findrdataset(db, node, NULL, result = dns_db_findrdataset(db, node, NULL,
dns_rdatatype_ds, 0, 0, dns_rdatatype_ds, 0, 0,
dsset, NULL); dsset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_SUCCESS) { if (result == ISC_R_SUCCESS) {
vbprintf(2, "found DS records\n"); vbprintf(2, "found DS records\n");
dsset->ttl = ttl; dsset->ttl = ttl;
@ -1058,7 +1058,7 @@ loadds(dns_name_t *name, uint32_t ttl, dns_rdataset_t *dsset) {
result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey, 0, 0, result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey, 0, 0,
&keyset, NULL); &keyset, NULL);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_db_detach(&db); dns_db_detach(&db);
return result; return result;
} }
@ -1092,7 +1092,7 @@ loadds(dns_name_t *name, uint32_t ttl, dns_rdataset_t *dsset) {
check_result(result, "dns_db_findrdataset"); check_result(result, "dns_db_findrdataset");
dns_rdataset_disassociate(&keyset); dns_rdataset_disassociate(&keyset);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_db_detach(&db); dns_db_detach(&db);
return result; return result;
} }
@ -1454,7 +1454,7 @@ setsoaserial(uint32_t serial, dns_updatemethod_t method) {
cleanup: cleanup:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
} }
dns_rdata_reset(&rdata); dns_rdata_reset(&rdata);
@ -1500,7 +1500,7 @@ signapex(void) {
check_dns_dbiterator_current(result); check_dns_dbiterator_current(result);
signname(node, true, name); signname(node, true, name);
dumpnode(name, node); dumpnode(name, node);
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
result = dns_dbiterator_first(gdbiter); result = dns_dbiterator_first(gdbiter);
if (result == ISC_R_NOMORE) { if (result == ISC_R_NOMORE) {
atomic_store(&finished, true); atomic_store(&finished, true);
@ -1559,7 +1559,7 @@ assignwork(void *arg) {
* The origin was handled by signapex(). * The origin was handled by signapex().
*/ */
if (dns_name_equal(name, gorigin)) { if (dns_name_equal(name, gorigin)) {
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
goto next; goto next;
} }
/* /*
@ -1603,7 +1603,7 @@ assignwork(void *arg) {
if (!found) { if (!found) {
dumpnode(name, node); dumpnode(name, node);
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
} }
next: next:
@ -1633,7 +1633,7 @@ assignwork(void *arg) {
* Write a node to the output file, and restart the worker task. * Write a node to the output file, and restart the worker task.
*/ */
lock_and_dumpnode(dns_fixedname_name(&fname), node); lock_and_dumpnode(dns_fixedname_name(&fname), node);
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
isc_async_current(assignwork, NULL); isc_async_current(assignwork, NULL);
} }
@ -1800,7 +1800,7 @@ nsecify(void) {
"rrsig)"); "rrsig)");
} }
dns_rdatasetiter_destroy(&rdsiter); dns_rdatasetiter_destroy(&rdsiter);
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
} }
dns_dbiterator_destroy(&dbiter); dns_dbiterator_destroy(&dbiter);
@ -1823,7 +1823,7 @@ nsecify(void) {
} else { } else {
check_result(result, "dns_dbiterator_next()"); check_result(result, "dns_dbiterator_next()");
} }
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
continue; continue;
} }
@ -1852,7 +1852,7 @@ nsecify(void) {
check_dns_dbiterator_current(result); check_dns_dbiterator_current(result);
active = active_node(nextnode); active = active_node(nextnode);
if (!active) { if (!active) {
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
} }
@ -1863,11 +1863,11 @@ nsecify(void) {
remove_sigs(nextnode, false, 0); remove_sigs(nextnode, false, 0);
remove_records(nextnode, dns_rdatatype_nsec, remove_records(nextnode, dns_rdatatype_nsec,
false); false);
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
} }
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
break; break;
} }
if (result == ISC_R_NOMORE) { if (result == ISC_R_NOMORE) {
@ -1881,7 +1881,7 @@ nsecify(void) {
result = dns_nsec_build(gdb, gversion, node, nextname, result = dns_nsec_build(gdb, gversion, node, nextname,
zone_soa_min_ttl); zone_soa_min_ttl);
check_result(result, "dns_nsec_build()"); check_result(result, "dns_nsec_build()");
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
} }
dns_dbiterator_destroy(&dbiter); dns_dbiterator_destroy(&dbiter);
@ -1939,7 +1939,7 @@ addnsec3param(const unsigned char *salt, size_t salt_len,
result = ISC_R_SUCCESS; result = ISC_R_SUCCESS;
} }
check_result(result, "addnsec3param: dns_db_addrdataset()"); check_result(result, "addnsec3param: dns_db_addrdataset()");
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
} }
static void static void
@ -1989,7 +1989,7 @@ addnsec3(dns_name_t *name, dns_dbnode_t *node, const unsigned char *salt,
result = ISC_R_SUCCESS; result = ISC_R_SUCCESS;
} }
check_result(result, "addnsec3: dns_db_addrdataset()"); check_result(result, "addnsec3: dns_db_addrdataset()");
dns_db_detachnode(gdb, &nsec3node); dns_db_detachnode(&nsec3node);
} }
/*% /*%
@ -2186,7 +2186,7 @@ cleanup_zone(void) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
dns_rdatasetiter_destroy(&rdsiter); dns_rdatasetiter_destroy(&rdsiter);
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
} }
result = dns_diff_applysilently(&del, gdb, gversion); result = dns_diff_applysilently(&del, gdb, gversion);
@ -2245,7 +2245,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
} else { } else {
check_result(result, "dns_dbiterator_next()"); check_result(result, "dns_dbiterator_next()");
} }
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
continue; continue;
} }
@ -2267,7 +2267,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
check_dns_dbiterator_current(result); check_dns_dbiterator_current(result);
active = active_node(nextnode); active = active_node(nextnode);
if (!active) { if (!active) {
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
} }
@ -2276,7 +2276,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
dns_name_issubdomain(nextname, zonecut))) dns_name_issubdomain(nextname, zonecut)))
{ {
remove_sigs(nextnode, false, 0); remove_sigs(nextnode, false, 0);
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
} }
@ -2291,14 +2291,14 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
if (OPTOUT(nsec3flags) && if (OPTOUT(nsec3flags) &&
!secure(nextname, nextnode)) !secure(nextname, nextnode))
{ {
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
} }
} else if (has_dname(gdb, gversion, nextnode)) { } else if (has_dname(gdb, gversion, nextnode)) {
zonecut = savezonecut(&fzonecut, nextname); zonecut = savezonecut(&fzonecut, nextname);
} }
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
break; break;
} }
if (result == ISC_R_NOMORE) { if (result == ISC_R_NOMORE) {
@ -2311,7 +2311,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
dns_name_downcase(name, name); dns_name_downcase(name, name);
hashlist_add_dns_name(hashlist, name, hashalg, iterations, salt, hashlist_add_dns_name(hashlist, name, hashalg, iterations, salt,
salt_len, false); salt_len, false);
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
/* /*
* Add hashes for empty nodes. Use closest encloser logic. * Add hashes for empty nodes. Use closest encloser logic.
* The closest encloser either has data or is a empty * The closest encloser either has data or is a empty
@ -2367,7 +2367,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
check_dns_dbiterator_current(result); check_dns_dbiterator_current(result);
nsec3clean(name, node, hashalg, iterations, salt, salt_len, nsec3clean(name, node, hashalg, iterations, salt, salt_len,
hashlist); hashlist);
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
} }
dns_dbiterator_destroy(&dbiter); dns_dbiterator_destroy(&dbiter);
@ -2393,7 +2393,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
} else { } else {
check_result(result, "dns_dbiterator_next()"); check_result(result, "dns_dbiterator_next()");
} }
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
continue; continue;
} }
@ -2409,7 +2409,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
check_dns_dbiterator_current(result); check_dns_dbiterator_current(result);
active = active_node(nextnode); active = active_node(nextnode);
if (!active) { if (!active) {
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
} }
@ -2417,7 +2417,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
(zonecut != NULL && (zonecut != NULL &&
dns_name_issubdomain(nextname, zonecut))) dns_name_issubdomain(nextname, zonecut)))
{ {
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
} }
@ -2428,14 +2428,14 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
if (OPTOUT(nsec3flags) && if (OPTOUT(nsec3flags) &&
!secure(nextname, nextnode)) !secure(nextname, nextnode))
{ {
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
} }
} else if (has_dname(gdb, gversion, nextnode)) { } else if (has_dname(gdb, gversion, nextnode)) {
zonecut = savezonecut(&fzonecut, nextname); zonecut = savezonecut(&fzonecut, nextname);
} }
dns_db_detachnode(gdb, &nextnode); dns_db_detachnode(&nextnode);
break; break;
} }
if (result == ISC_R_NOMORE) { if (result == ISC_R_NOMORE) {
@ -2451,7 +2451,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
dns_dbiterator_pause(dbiter); dns_dbiterator_pause(dbiter);
addnsec3(name, node, salt, salt_len, iterations, hashlist, addnsec3(name, node, salt, salt_len, iterations, hashlist,
zone_soa_min_ttl); zone_soa_min_ttl);
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
/* /*
* Add NSEC3's for empty nodes. Use closest encloser logic. * Add NSEC3's for empty nodes. Use closest encloser logic.
*/ */
@ -2573,7 +2573,7 @@ cleanup:
if (dns_rdataset_isassociated(&soasigs)) { if (dns_rdataset_isassociated(&soasigs)) {
dns_rdataset_disassociate(&soasigs); dns_rdataset_disassociate(&soasigs);
} }
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
dns_db_closeversion(gdb, &currentversion, false); dns_db_closeversion(gdb, &currentversion, false);
} }
@ -2792,7 +2792,7 @@ findkeys:
isc_result_totext(result)); isc_result_totext(result));
} }
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
dns_db_closeversion(gdb, &ver, true); dns_db_closeversion(gdb, &ver, true);
dns_diff_clear(&diff); dns_diff_clear(&diff);
@ -2856,7 +2856,7 @@ warnifallksk(dns_db_t *db) {
dns_rdata_freestruct(&dnskey); dns_rdata_freestruct(&dnskey);
} }
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_db_closeversion(db, &currentversion, false); dns_db_closeversion(db, &currentversion, false);
if (!have_non_ksk && !ignore_kskflag) { if (!have_non_ksk && !ignore_kskflag) {
if (disable_zone_check) { if (disable_zone_check) {
@ -2968,7 +2968,7 @@ cleanup:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(gdb, &node); dns_db_detachnode(&node);
} }
dns_db_closeversion(gdb, &ver, false); dns_db_closeversion(gdb, &ver, false);
} }

View File

@ -62,12 +62,12 @@ typedef struct bdb {
} bdb_t; } bdb_t;
struct bdbnode { struct bdbnode {
unsigned int magic; DBNODE_FIELDS;
isc_refcount_t references; isc_refcount_t references;
bdb_t *bdb; bdb_t *bdb;
ISC_LIST(dns_rdatalist_t) lists; ISC_LIST(dns_rdatalist_t) lists;
ISC_LIST(isc_buffer_t) buffers; ISC_LIST(isc_buffer_t) buffers;
dns_name_t *name;
ISC_LINK(bdbnode_t) link; ISC_LINK(bdbnode_t) link;
dns_rdatacallbacks_t callbacks; dns_rdatacallbacks_t callbacks;
}; };
@ -83,12 +83,21 @@ findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdataset_t *rdataset, dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG); dns_rdataset_t *sigrdataset DNS__DB_FLARG);
/*
* Node methods forward declarations
*/
static void static void
attachnode(dns_db_t *db, dns_dbnode_t *source, bdbnode_attachnode(dns_dbnode_t *source, dns_dbnode_t **targetp DNS__DB_FLARG);
dns_dbnode_t **targetp DNS__DB_FLARG); static void
bdbnode_detachnode(dns_dbnode_t **nodep DNS__DB_FLARG);
static void /*
detachnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG); * Node methods structure
*/
static dns_dbnode_methods_t bdbnode_methods = (dns_dbnode_methods_t){
.attachnode = bdbnode_attachnode,
.detachnode = bdbnode_detachnode,
};
/* /*
* Helper functions to convert text to wire forma. * Helper functions to convert text to wire forma.
@ -613,21 +622,17 @@ ipv4reverse_lookup(bdbnode_t *node) {
static void static void
disassociate(dns_rdataset_t *rdataset DNS__DB_FLARG) { disassociate(dns_rdataset_t *rdataset DNS__DB_FLARG) {
dns_dbnode_t *node = rdataset->rdlist.node; dns_dbnode_t *node = rdataset->rdlist.node;
bdbnode_t *bdbnode = (bdbnode_t *)node;
dns_db_t *db = (dns_db_t *)bdbnode->bdb;
detachnode(db, &node DNS__DB_FLARG_PASS); bdbnode_detachnode(&node DNS__DB_FLARG_PASS);
dns_rdatalist_disassociate(rdataset DNS__DB_FLARG_PASS); dns_rdatalist_disassociate(rdataset DNS__DB_FLARG_PASS);
} }
static void static void
rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target DNS__DB_FLARG) { rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target DNS__DB_FLARG) {
dns_dbnode_t *node = source->rdlist.node; dns_dbnode_t *node = source->rdlist.node;
bdbnode_t *bdbnode = (bdbnode_t *)node;
dns_db_t *db = (dns_db_t *)bdbnode->bdb;
dns_rdatalist_clone(source, target DNS__DB_FLARG_PASS); dns_rdatalist_clone(source, target DNS__DB_FLARG_PASS);
attachnode(db, node, &target->rdlist.node DNS__DB_FLARG_PASS); bdbnode_attachnode(node, &target->rdlist.node DNS__DB_FLARG_PASS);
} }
static dns_rdatasetmethods_t bdb_rdataset_methods = { static dns_rdatasetmethods_t bdb_rdataset_methods = {
@ -642,12 +647,12 @@ static dns_rdatasetmethods_t bdb_rdataset_methods = {
}; };
static void static void
new_rdataset(dns_rdatalist_t *rdatalist, dns_db_t *db, dns_dbnode_t *node, new_rdataset(dns_rdatalist_t *rdatalist, dns_db_t *db ISC_ATTR_UNUSED,
dns_rdataset_t *rdataset) { dns_dbnode_t *node, dns_rdataset_t *rdataset) {
dns_rdatalist_tordataset(rdatalist, rdataset); dns_rdatalist_tordataset(rdatalist, rdataset);
rdataset->methods = &bdb_rdataset_methods; rdataset->methods = &bdb_rdataset_methods;
dns_db_attachnode(db, node, &rdataset->rdlist.node); dns_db_attachnode(node, &rdataset->rdlist.node);
} }
/* /*
@ -657,8 +662,7 @@ new_rdataset(dns_rdatalist_t *rdatalist, dns_db_t *db, dns_dbnode_t *node,
static void static void
rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp DNS__DB_FLARG) { rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp DNS__DB_FLARG) {
bdb_rdatasetiter_t *bdbiterator = (bdb_rdatasetiter_t *)(*iteratorp); bdb_rdatasetiter_t *bdbiterator = (bdb_rdatasetiter_t *)(*iteratorp);
detachnode(bdbiterator->common.db, bdbnode_detachnode(&bdbiterator->common.node DNS__DB_FLARG_PASS);
&bdbiterator->common.node DNS__DB_FLARG_PASS);
isc_mem_put(bdbiterator->common.db->mctx, bdbiterator, isc_mem_put(bdbiterator->common.db->mctx, bdbiterator,
sizeof(bdb_rdatasetiter_t)); sizeof(bdb_rdatasetiter_t));
*iteratorp = NULL; *iteratorp = NULL;
@ -785,6 +789,7 @@ createnode(bdb_t *bdb, bdbnode_t **nodep) {
isc_refcount_init(&node->references, 1); isc_refcount_init(&node->references, 1);
node->magic = BDBNODE_MAGIC; node->magic = BDBNODE_MAGIC;
node->methods = &bdbnode_methods;
*nodep = node; *nodep = node;
return ISC_R_SUCCESS; return ISC_R_SUCCESS;
@ -812,11 +817,6 @@ destroynode(bdbnode_t *node) {
isc_buffer_free(&b); isc_buffer_free(&b);
} }
if (node->name != NULL) {
dns_name_free(node->name, mctx);
isc_mem_put(mctx, node->name, sizeof(dns_name_t));
}
node->magic = 0; node->magic = 0;
isc_mem_put(mctx, node, sizeof(bdbnode_t)); isc_mem_put(mctx, node, sizeof(bdbnode_t));
dns_db_detach((dns_db_t **)(void *)&bdb); dns_db_detach((dns_db_t **)(void *)&bdb);
@ -1060,31 +1060,25 @@ find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
if (nodep != NULL) { if (nodep != NULL) {
*nodep = node; *nodep = node;
} else if (node != NULL) { } else if (node != NULL) {
detachnode(db, &node DNS__DB_FLARG_PASS); bdbnode_detachnode(&node DNS__DB_FLARG_PASS);
} }
return result; return result;
} }
static void static void
attachnode(dns_db_t *db, dns_dbnode_t *source, bdbnode_attachnode(dns_dbnode_t *source, dns_dbnode_t **targetp DNS__DB_FLARG) {
dns_dbnode_t **targetp DNS__DB_FLARG) {
bdb_t *bdb = (bdb_t *)db;
bdbnode_t *node = (bdbnode_t *)source; bdbnode_t *node = (bdbnode_t *)source;
REQUIRE(VALID_BDB(bdb));
isc_refcount_increment(&node->references); isc_refcount_increment(&node->references);
*targetp = source; *targetp = source;
} }
static void static void
detachnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG) { bdbnode_detachnode(dns_dbnode_t **nodep DNS__DB_FLARG) {
bdb_t *bdb = (bdb_t *)db;
bdbnode_t *node = NULL; bdbnode_t *node = NULL;
REQUIRE(VALID_BDB(bdb));
REQUIRE(nodep != NULL && *nodep != NULL); REQUIRE(nodep != NULL && *nodep != NULL);
node = (bdbnode_t *)(*nodep); node = (bdbnode_t *)(*nodep);
@ -1141,7 +1135,7 @@ allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
.common.magic = DNS_RDATASETITER_MAGIC, .common.magic = DNS_RDATASETITER_MAGIC,
}; };
attachnode(db, node, &iterator->common.node DNS__DB_FLARG_PASS); bdbnode_attachnode(node, &iterator->common.node DNS__DB_FLARG_PASS);
*iteratorp = (dns_rdatasetiter_t *)iterator; *iteratorp = (dns_rdatasetiter_t *)iterator;
@ -1153,8 +1147,6 @@ static dns_dbmethods_t bdb_methods = {
.currentversion = currentversion, .currentversion = currentversion,
.attachversion = attachversion, .attachversion = attachversion,
.closeversion = closeversion, .closeversion = closeversion,
.attachnode = attachnode,
.detachnode = detachnode,
.findrdataset = findrdataset, .findrdataset = findrdataset,
.allrdatasets = allrdatasets, .allrdatasets = allrdatasets,
.getoriginnode = getoriginnode, .getoriginnode = getoriginnode,

View File

@ -3099,7 +3099,7 @@ add_soa(dns_db_t *db, dns_dbversion_t *version, const dns_name_t *name,
cleanup: cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -3139,7 +3139,7 @@ add_ns(dns_db_t *db, dns_dbversion_t *version, const dns_name_t *name,
cleanup: cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -6778,7 +6778,7 @@ tat_done(void *arg) {
/* Free resources which are not of interest */ /* Free resources which are not of interest */
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_detach(&resp->db); dns_db_detach(&resp->db);
@ -14317,7 +14317,7 @@ cleanup:
dns_rdataset_disassociate(&privset); dns_rdataset_disassociate(&privset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (version != NULL) { if (version != NULL) {
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);

View File

@ -661,7 +661,7 @@ cleanup:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (apexnode != NULL) { if (apexnode != NULL) {
dns_db_detachnode(db, &apexnode); dns_db_detachnode(&apexnode);
} }
if (dbversion != NULL) { if (dbversion != NULL) {
dns_db_closeversion(db, &dbversion, false); dns_db_closeversion(db, &dbversion, false);

View File

@ -164,25 +164,6 @@ findzonecut(dns_db_t *db, const dns_name_t *name, unsigned int options,
sigrdataset DNS__DB_FLARG_PASS); sigrdataset DNS__DB_FLARG_PASS);
} }
static void
attachnode(dns_db_t *db, dns_dbnode_t *source,
dns_dbnode_t **targetp DNS__DB_FLARG) {
sampledb_t *sampledb = (sampledb_t *)db;
REQUIRE(VALID_SAMPLEDB(sampledb));
dns__db_attachnode(sampledb->db, source, targetp DNS__DB_FLARG_PASS);
}
static void
detachnode(dns_db_t *db, dns_dbnode_t **targetp DNS__DB_FLARG) {
sampledb_t *sampledb = (sampledb_t *)db;
REQUIRE(VALID_SAMPLEDB(sampledb));
dns__db_detachnode(sampledb->db, targetp DNS__DB_FLARG_PASS);
}
static isc_result_t static isc_result_t
createiterator(dns_db_t *db, unsigned int options, createiterator(dns_db_t *db, unsigned int options,
dns_dbiterator_t **iteratorp) { dns_dbiterator_t **iteratorp) {
@ -233,8 +214,7 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
CHECK(dns__db_addrdataset(sampledb->db, node, version, now, rdataset, CHECK(dns__db_addrdataset(sampledb->db, node, version, now, rdataset,
options, addedrdataset DNS__DB_FLARG_PASS)); options, addedrdataset DNS__DB_FLARG_PASS));
if (dns_rdatatype_isaddr(rdataset->type)) { if (dns_rdatatype_isaddr(rdataset->type)) {
CHECK(dns_db_nodefullname(sampledb->db, node, CHECK(dns_db_nodefullname(node, dns_fixedname_name(&name)));
dns_fixedname_name(&name)));
CHECK(syncptrs(sampledb->inst, dns_fixedname_name(&name), CHECK(syncptrs(sampledb->inst, dns_fixedname_name(&name),
rdataset, DNS_DIFFOP_ADD)); rdataset, DNS_DIFFOP_ADD));
} }
@ -262,8 +242,7 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
} }
if (dns_rdatatype_isaddr(rdataset->type)) { if (dns_rdatatype_isaddr(rdataset->type)) {
CHECK(dns_db_nodefullname(sampledb->db, node, CHECK(dns_db_nodefullname(node, dns_fixedname_name(&name)));
dns_fixedname_name(&name)));
CHECK(syncptrs(sampledb->inst, dns_fixedname_name(&name), CHECK(syncptrs(sampledb->inst, dns_fixedname_name(&name),
rdataset, DNS_DIFFOP_DEL)); rdataset, DNS_DIFFOP_DEL));
} }
@ -410,15 +389,6 @@ setcachestats(dns_db_t *db, isc_stats_t *stats) {
return dns_db_setcachestats(sampledb->db, stats); return dns_db_setcachestats(sampledb->db, stats);
} }
static isc_result_t
nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name) {
sampledb_t *sampledb = (sampledb_t *)db;
REQUIRE(VALID_SAMPLEDB(sampledb));
return dns_db_nodefullname(sampledb->db, node, name);
}
/* /*
* DB interface definition. Database driver uses this structure to * DB interface definition. Database driver uses this structure to
* determine which implementation of dns_db_*() function to call. * determine which implementation of dns_db_*() function to call.
@ -432,8 +402,6 @@ static dns_dbmethods_t sampledb_methods = {
.findnode = findnode, .findnode = findnode,
.find = find, .find = find,
.findzonecut = findzonecut, .findzonecut = findzonecut,
.attachnode = attachnode,
.detachnode = detachnode,
.createiterator = createiterator, .createiterator = createiterator,
.findrdataset = findrdataset, .findrdataset = findrdataset,
.allrdatasets = allrdatasets, .allrdatasets = allrdatasets,
@ -452,7 +420,6 @@ static dns_dbmethods_t sampledb_methods = {
.findnodeext = findnodeext, .findnodeext = findnodeext,
.findext = findext, .findext = findext,
.setcachestats = setcachestats, .setcachestats = setcachestats,
.nodefullname = nodefullname,
}; };
/* Auxiliary driver functions. */ /* Auxiliary driver functions. */
@ -490,7 +457,7 @@ add_soa(dns_db_t *db, dns_dbversion_t *version, const dns_name_t *name,
CHECK(dns_db_addrdataset(db, node, version, 0, &rdataset, 0, NULL)); CHECK(dns_db_addrdataset(db, node, version, 0, &rdataset, 0, NULL));
cleanup: cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -528,7 +495,7 @@ add_ns(dns_db_t *db, dns_dbversion_t *version, const dns_name_t *name,
CHECK(dns_db_addrdataset(db, node, version, 0, &rdataset, 0, NULL)); CHECK(dns_db_addrdataset(db, node, version, 0, &rdataset, 0, NULL));
cleanup: cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -564,7 +531,7 @@ add_a(dns_db_t *db, dns_dbversion_t *version, const dns_name_t *name,
CHECK(dns_db_addrdataset(db, node, version, 0, &rdataset, 0, NULL)); CHECK(dns_db_addrdataset(db, node, version, 0, &rdataset, 0, NULL));
cleanup: cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }

View File

@ -2594,7 +2594,7 @@ fetch_callback(void *arg) {
* Cleanup things we don't care about. * Cleanup things we don't care about.
*/ */
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_detach(&resp->db); dns_db_detach(&resp->db);

View File

@ -439,7 +439,7 @@ cleartree(dns_db_t *db, const dns_name_t *name) {
if (result != ISC_R_SUCCESS && answer == ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS && answer == ISC_R_SUCCESS) {
answer = result; answer = result;
} }
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
result = dns_dbiterator_next(iter); result = dns_dbiterator_next(iter);
} }
@ -451,13 +451,13 @@ cleanup:
answer = result; answer = result;
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (iter != NULL) { if (iter != NULL) {
dns_dbiterator_destroy(&iter); dns_dbiterator_destroy(&iter);
} }
if (top != NULL) { if (top != NULL) {
dns_db_detachnode(db, &top); dns_db_detachnode(&top);
} }
return answer; return answer;
@ -499,7 +499,7 @@ dns_cache_flushnode(dns_cache_t *cache, const dns_name_t *name, bool tree) {
goto cleanup_db; goto cleanup_db;
} }
result = clearnode(cache->db, node); result = clearnode(cache->db, node);
dns_db_detachnode(cache->db, &node); dns_db_detachnode(&node);
} }
cleanup_db: cleanup_db:

View File

@ -2363,7 +2363,7 @@ dns__catz_update_cb(void *data) {
vers_node = node; vers_node = node;
} else if (node == vers_node) { } else if (node == vers_node) {
/* Skip the already processed version node */ /* Skip the already processed version node */
dns_db_detachnode(updb, &node); dns_db_detachnode(&node);
result = dns_dbiterator_next(updbit); result = dns_dbiterator_next(updbit);
continue; continue;
} }
@ -2375,7 +2375,7 @@ dns__catz_update_cb(void *data) {
DNS_LOGMODULE_CATZ, ISC_LOG_ERROR, DNS_LOGMODULE_CATZ, ISC_LOG_ERROR,
"catz: failed to fetch rrdatasets - %s", "catz: failed to fetch rrdatasets - %s",
isc_result_totext(result)); isc_result_totext(result));
dns_db_detachnode(updb, &node); dns_db_detachnode(&node);
break; break;
} }
@ -2429,7 +2429,7 @@ dns__catz_update_cb(void *data) {
dns_rdatasetiter_destroy(&rdsiter); dns_rdatasetiter_destroy(&rdsiter);
dns_db_detachnode(updb, &node); dns_db_detachnode(&node);
if (!is_vers_processed) { if (!is_vers_processed) {
is_vers_processed = true; is_vers_processed = true;

View File

@ -526,7 +526,7 @@ client_resfind(resctx_t *rctx, dns_fetchresponse_t *resp) {
*/ */
if (node != NULL) { if (node != NULL) {
INSIST(db != NULL); INSIST(db != NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (db != NULL) { if (db != NULL) {
dns_db_detach(&db); dns_db_detach(&db);
@ -774,7 +774,7 @@ client_resfind(resctx_t *rctx, dns_fetchresponse_t *resp) {
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (db != NULL) { if (db != NULL) {
dns_db_detach(&db); dns_db_detach(&db);

View File

@ -564,29 +564,29 @@ dns__db_findzonecut(dns_db_t *db, const dns_name_t *name, unsigned int options,
} }
void void
dns__db_attachnode(dns_db_t *db, dns_dbnode_t *source, dns__db_attachnode(dns_dbnode_t *source, dns_dbnode_t **targetp DNS__DB_FLARG) {
dns_dbnode_t **targetp DNS__DB_FLARG) {
/* /*
* Attach *targetp to source. * Attach *targetp to source.
*/ */
REQUIRE(DNS_DB_VALID(db));
REQUIRE(source != NULL); REQUIRE(source != NULL);
REQUIRE(targetp != NULL && *targetp == NULL); REQUIRE(targetp != NULL && *targetp == NULL);
REQUIRE(source->methods != NULL && source->methods->attachnode != NULL);
(db->methods->attachnode)(db, source, targetp DNS__DB_FLARG_PASS); (source->methods->attachnode)(source, targetp DNS__DB_FLARG_PASS);
} }
void void
dns__db_detachnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG) { dns__db_detachnode(dns_dbnode_t **nodep DNS__DB_FLARG) {
/* /*
* Detach *nodep from its node. * Detach *nodep from its node.
*/ */
REQUIRE(DNS_DB_VALID(db));
REQUIRE(nodep != NULL && *nodep != NULL); REQUIRE(nodep != NULL && *nodep != NULL);
dns_dbnode_t *node = *nodep;
REQUIRE(node->methods != NULL && node->methods->detachnode != NULL);
(db->methods->detachnode)(db, nodep DNS__DB_FLARG_PASS); (node->methods->detachnode)(nodep DNS__DB_FLARG_PASS);
ENSURE(*nodep == NULL); ENSURE(*nodep == NULL);
} }
@ -786,7 +786,7 @@ freerdataset:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
freenode: freenode:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -1118,41 +1118,44 @@ dns_db_addglue(dns_db_t *db, dns_dbversion_t *version, dns_rdataset_t *rdataset,
} }
void void
dns_db_locknode(dns_db_t *db, dns_dbnode_t *node, isc_rwlocktype_t type) { dns_db_locknode(dns_dbnode_t *node, isc_rwlocktype_t type) {
if (db->methods->locknode != NULL) { REQUIRE(node != NULL && node->methods != NULL);
(db->methods->locknode)(db, node, type); if (node->methods->locknode != NULL) {
(node->methods->locknode)(node, type);
} }
} }
void void
dns_db_unlocknode(dns_db_t *db, dns_dbnode_t *node, isc_rwlocktype_t type) { dns_db_unlocknode(dns_dbnode_t *node, isc_rwlocktype_t type) {
if (db->methods->unlocknode != NULL) { REQUIRE(node != NULL && node->methods != NULL);
(db->methods->unlocknode)(db, node, type); if (node->methods->unlocknode != NULL) {
(node->methods->unlocknode)(node, type);
} }
} }
void void
dns_db_expiredata(dns_db_t *db, dns_dbnode_t *node, void *data) { dns_db_expiredata(dns_dbnode_t *node, void *data) {
if (db->methods->expiredata != NULL) { REQUIRE(node != NULL && node->methods != NULL);
(db->methods->expiredata)(db, node, data); if (node->methods->expiredata != NULL) {
(node->methods->expiredata)(node, data);
} }
} }
void void
dns_db_deletedata(dns_db_t *db, dns_dbnode_t *node, void *data) { dns_db_deletedata(dns_dbnode_t *node, void *data) {
if (db->methods->deletedata != NULL) { REQUIRE(node != NULL && node->methods != NULL);
(db->methods->deletedata)(db, node, data); if (node->methods->deletedata != NULL) {
(node->methods->deletedata)(node, data);
} }
} }
isc_result_t isc_result_t
dns_db_nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name) { dns_db_nodefullname(dns_dbnode_t *node, dns_name_t *name) {
REQUIRE(db != NULL); REQUIRE(node != NULL && node->methods != NULL);
REQUIRE(node != NULL);
REQUIRE(name != NULL); REQUIRE(name != NULL);
if (db->methods->nodefullname != NULL) { if (node->methods != NULL && node->methods->nodefullname != NULL) {
return (db->methods->nodefullname)(db, node, name); return node->methods->nodefullname(node, name);
} }
return ISC_R_NOTIMPLEMENTED; return ISC_R_NOTIMPLEMENTED;
} }

View File

@ -502,7 +502,7 @@ diff_apply(const dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver,
} }
CHECK(result); CHECK(result);
} }
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (dns_rdataset_isassociated(&ardataset)) { if (dns_rdataset_isassociated(&ardataset)) {
dns_rdataset_disassociate(&ardataset); dns_rdataset_disassociate(&ardataset);
} }
@ -512,7 +512,7 @@ diff_apply(const dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver,
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }

View File

@ -75,7 +75,21 @@ extern unsigned int dns_pps;
***** Types ***** Types
*****/ *****/
typedef struct dns_dbmethods { typedef struct dns_dbnode_methods {
isc_result_t (*nodefullname)(dns_dbnode_t *node, dns_name_t *name);
void (*attachnode)(dns_dbnode_t *source,
dns_dbnode_t **targetp DNS__DB_FLARG);
void (*detachnode)(dns_dbnode_t **targetp DNS__DB_FLARG);
void (*locknode)(dns_dbnode_t *node, isc_rwlocktype_t t);
void (*unlocknode)(dns_dbnode_t *node, isc_rwlocktype_t t);
void (*deletedata)(dns_dbnode_t *node, void *data);
void (*expiredata)(dns_dbnode_t *node, void *data);
} dns_dbnode_methods_t;
typedef struct dns_db_methods {
void (*destroy)(dns_db_t *db); void (*destroy)(dns_db_t *db);
isc_result_t (*beginload)(dns_db_t *db, isc_result_t (*beginload)(dns_db_t *db,
dns_rdatacallbacks_t *callbacks); dns_rdatacallbacks_t *callbacks);
@ -101,9 +115,6 @@ typedef struct dns_dbmethods {
dns_name_t *dcname, dns_name_t *dcname,
dns_rdataset_t *rdataset, dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset DNS__DB_FLARG); dns_rdataset_t *sigrdataset DNS__DB_FLARG);
void (*attachnode)(dns_db_t *db, dns_dbnode_t *source,
dns_dbnode_t **targetp DNS__DB_FLARG);
void (*detachnode)(dns_db_t *db, dns_dbnode_t **targetp DNS__DB_FLARG);
isc_result_t (*createiterator)(dns_db_t *db, unsigned int options, isc_result_t (*createiterator)(dns_db_t *db, unsigned int options,
dns_dbiterator_t **iteratorp); dns_dbiterator_t **iteratorp);
isc_result_t (*findrdataset)(dns_db_t *db, dns_dbnode_t *node, isc_result_t (*findrdataset)(dns_db_t *db, dns_dbnode_t *node,
@ -171,15 +182,8 @@ typedef struct dns_dbmethods {
isc_result_t (*setservestalerefresh)(dns_db_t *db, uint32_t interval); isc_result_t (*setservestalerefresh)(dns_db_t *db, uint32_t interval);
isc_result_t (*getservestalerefresh)(dns_db_t *db, uint32_t *interval); isc_result_t (*getservestalerefresh)(dns_db_t *db, uint32_t *interval);
isc_result_t (*setgluecachestats)(dns_db_t *db, isc_stats_t *stats); isc_result_t (*setgluecachestats)(dns_db_t *db, isc_stats_t *stats);
void (*locknode)(dns_db_t *db, dns_dbnode_t *node, isc_rwlocktype_t t);
void (*unlocknode)(dns_db_t *db, dns_dbnode_t *node,
isc_rwlocktype_t t);
void (*addglue)(dns_db_t *db, dns_dbversion_t *version, void (*addglue)(dns_db_t *db, dns_dbversion_t *version,
dns_rdataset_t *rdataset, dns_message_t *msg); dns_rdataset_t *rdataset, dns_message_t *msg);
void (*expiredata)(dns_db_t *db, dns_dbnode_t *node, void *data);
void (*deletedata)(dns_db_t *db, dns_dbnode_t *node, void *data);
isc_result_t (*nodefullname)(dns_db_t *db, dns_dbnode_t *node,
dns_name_t *name);
void (*setmaxrrperset)(dns_db_t *db, uint32_t value); void (*setmaxrrperset)(dns_db_t *db, uint32_t value);
void (*setmaxtypepername)(dns_db_t *db, uint32_t value); void (*setmaxtypepername)(dns_db_t *db, uint32_t value);
isc_result_t (*getzoneversion)(dns_db_t *db, isc_buffer_t *b); isc_result_t (*getzoneversion)(dns_db_t *db, isc_buffer_t *b);
@ -197,6 +201,17 @@ typedef isc_result_t (*dns_dbupdate_callback_t)(dns_db_t *db, void *fn_arg);
#define DNS_DB_MAGIC ISC_MAGIC('D', 'N', 'S', 'D') #define DNS_DB_MAGIC ISC_MAGIC('D', 'N', 'S', 'D')
#define DNS_DB_VALID(db) ISC_MAGIC_VALID(db, DNS_DB_MAGIC) #define DNS_DB_VALID(db) ISC_MAGIC_VALID(db, DNS_DB_MAGIC)
#define DBNODE_FIELDS \
unsigned int magic; \
uint16_t locknum; \
dns_dbnode_methods_t *methods; \
isc_mem_t *mctx; \
dns_name_t name;
struct dns_dbnode {
DBNODE_FIELDS;
};
/*% /*%
* This structure is actually just the common prefix of a DNS db * This structure is actually just the common prefix of a DNS db
* implementation's version of a dns_db_t. * implementation's version of a dns_db_t.
@ -986,11 +1001,10 @@ dns__db_findzonecut(dns_db_t *db, const dns_name_t *name, unsigned int options,
* errors. * errors.
*/ */
#define dns_db_attachnode(db, source, targetp) \ #define dns_db_attachnode(source, targetp) \
dns__db_attachnode(db, source, targetp DNS__DB_FILELINE) dns__db_attachnode(source, targetp DNS__DB_FILELINE)
void void
dns__db_attachnode(dns_db_t *db, dns_dbnode_t *source, dns__db_attachnode(dns_dbnode_t *source, dns_dbnode_t **targetp DNS__DB_FLARG);
dns_dbnode_t **targetp DNS__DB_FLARG);
/*%< /*%<
* Attach *targetp to source. * Attach *targetp to source.
* *
@ -1007,10 +1021,9 @@ dns__db_attachnode(dns_db_t *db, dns_dbnode_t *source,
* \li *targetp is attached to source. * \li *targetp is attached to source.
*/ */
#define dns_db_detachnode(db, nodep) \ #define dns_db_detachnode(nodep) dns__db_detachnode(nodep DNS__DB_FILELINE)
dns__db_detachnode(db, nodep DNS__DB_FILELINE)
void void
dns__db_detachnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG); dns__db_detachnode(dns_dbnode_t **nodep DNS__DB_FLARG);
/*%< /*%<
* Detach *nodep from its node. * Detach *nodep from its node.
* *
@ -1734,9 +1747,9 @@ dns_db_setgluecachestats(dns_db_t *db, isc_stats_t *stats);
*/ */
void void
dns_db_locknode(dns_db_t *db, dns_dbnode_t *node, isc_rwlocktype_t type); dns_db_locknode(dns_dbnode_t *node, isc_rwlocktype_t type);
void void
dns_db_unlocknode(dns_db_t *db, dns_dbnode_t *node, isc_rwlocktype_t type); dns_db_unlocknode(dns_dbnode_t *node, isc_rwlocktype_t type);
/*%< /*%<
* Lock/unlock a single node within a database so that data stored * Lock/unlock a single node within a database so that data stored
* there can be manipulated directly. * there can be manipulated directly.
@ -1763,22 +1776,22 @@ dns_db_addglue(dns_db_t *db, dns_dbversion_t *version, dns_rdataset_t *rdataset,
*/ */
void void
dns_db_expiredata(dns_db_t *db, dns_dbnode_t *node, void *data); dns_db_expiredata(dns_dbnode_t *node, void *data);
/*%< /*%<
* Tell the database 'db' to mark a block of data 'data' stored at * Tell the database 'db' to mark a block of data 'data' stored at
* node 'node' as expired. * node 'node' as expired.
*/ */
void void
dns_db_deletedata(dns_db_t *db, dns_dbnode_t *node, void *data); dns_db_deletedata(dns_dbnode_t *node, void *data);
/*%< /*%<
* Tell the database 'db' to prepare to delete the block of data 'data' * Tell the database to prepare to delete the block of data 'data'
* stored at node 'node. This may include, for example, removing the * stored at node 'node. This may include, for example, removing the
* data from an LRU list or a heap. * data from an LRU list or a heap.
*/ */
isc_result_t isc_result_t
dns_db_nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name); dns_db_nodefullname(dns_dbnode_t *node, dns_name_t *name);
/*%< /*%<
* Get the name associated with a database node. * Get the name associated with a database node.
* *

View File

@ -119,7 +119,6 @@ struct dns_slabheader {
* this rdataset. * this rdataset.
*/ */
dns_db_t *db;
dns_dbnode_t *node; dns_dbnode_t *node;
/*%< /*%<
* The database and database node objects containing * The database and database node objects containing

View File

@ -57,16 +57,15 @@ typedef uint16_t dns_cert_t;
typedef struct dns_compress dns_compress_t; typedef struct dns_compress dns_compress_t;
typedef enum dns_compress_flags dns_compress_flags_t; typedef enum dns_compress_flags dns_compress_flags_t;
typedef struct dns_compress_slot dns_compress_slot_t; typedef struct dns_compress_slot dns_compress_slot_t;
typedef struct dns_dbnode dns_dbnode_t;
typedef struct dns_db dns_db_t; typedef struct dns_db dns_db_t;
typedef struct dns_dbimplementation dns_dbimplementation_t; typedef struct dns_dbimplementation dns_dbimplementation_t;
typedef struct dns_dbiterator dns_dbiterator_t; typedef struct dns_dbiterator dns_dbiterator_t;
typedef void dns_dbload_t; typedef void dns_dbload_t;
typedef struct dns_dbnode dns_dbnode_t; /* this is dummy struct for proper type typedef struct dns_dbonupdatelistener dns_dbonupdatelistener_t;
checking */ typedef struct dns_dbversion dns_dbversion_t;
typedef struct dns_dbonupdatelistener dns_dbonupdatelistener_t; typedef struct dns_dlzimplementation dns_dlzimplementation_t;
typedef struct dns_dbversion dns_dbversion_t; typedef struct dns_dlzdb dns_dlzdb_t;
typedef struct dns_dlzimplementation dns_dlzimplementation_t;
typedef struct dns_dlzdb dns_dlzdb_t;
typedef ISC_LIST(dns_dlzdb_t) dns_dlzdblist_t; typedef ISC_LIST(dns_dlzdb_t) dns_dlzdblist_t;
typedef struct dns_dyndbctx dns_dyndbctx_t; typedef struct dns_dyndbctx dns_dyndbctx_t;
typedef struct dns_sdlzimplementation dns_sdlzimplementation_t; typedef struct dns_sdlzimplementation dns_sdlzimplementation_t;

View File

@ -155,11 +155,11 @@ dns_db_createsoatuple(dns_db_t *db, dns_dbversion_t *ver, isc_mem_t *mctx,
dns_difftuple_create(mctx, op, zonename, rdataset.ttl, &rdata, tp); dns_difftuple_create(mctx, op, zonename, rdataset.ttl, &rdata, tp);
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
freenode: freenode:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
nonode: nonode:
UNEXPECTED_ERROR("missing SOA"); UNEXPECTED_ERROR("missing SOA");
return result; return result;
@ -2158,7 +2158,7 @@ get_name_diff(dns_db_t *db, dns_dbversion_t *ver, isc_stdtime_t now,
result = ISC_R_SUCCESS; result = ISC_R_SUCCESS;
cleanup_node: cleanup_node:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }

View File

@ -1735,17 +1735,17 @@ dumptostream(dns_dumpctx_t *dctx) {
result = dns_db_allrdatasets(dctx->db, node, dctx->version, result = dns_db_allrdatasets(dctx->db, node, dctx->version,
options, dctx->now, &rdsiter); options, dctx->now, &rdsiter);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(dctx->db, &node); dns_db_detachnode(&node);
goto cleanup; goto cleanup;
} }
result = (dctx->dumpsets)(dctx->mctx, name, rdsiter, result = (dctx->dumpsets)(dctx->mctx, name, rdsiter,
&dctx->tctx, &buffer, dctx->f); &dctx->tctx, &buffer, dctx->f);
dns_rdatasetiter_destroy(&rdsiter); dns_rdatasetiter_destroy(&rdsiter);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(dctx->db, &node); dns_db_detachnode(&node);
goto cleanup; goto cleanup;
} }
dns_db_detachnode(dctx->db, &node); dns_db_detachnode(&node);
} }
if (result == ISC_R_NOMORE) { if (result == ISC_R_NOMORE) {

View File

@ -254,7 +254,7 @@ dns_nsec_nseconly(dns_db_t *db, dns_dbversion_t *version, dns_diff_t *diff,
result = dns_db_findrdataset(db, node, version, dns_rdatatype_dnskey, 0, result = dns_db_findrdataset(db, node, version, dns_rdatatype_dnskey, 0,
0, &rdataset, NULL); 0, &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_NOTFOUND) { if (result == ISC_R_NOTFOUND) {
*answer = false; *answer = false;

View File

@ -374,7 +374,7 @@ name_exists(dns_db_t *db, dns_dbversion_t *version, const dns_name_t *name,
dns_rdatasetiter_destroy(&iter); dns_rdatasetiter_destroy(&iter);
cleanup_node: cleanup_node:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -446,7 +446,7 @@ delnsec3(dns_db_t *db, dns_dbversion_t *version, const dns_name_t *name,
failure: failure:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
cleanup_node: cleanup_node:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -640,7 +640,7 @@ dns_nsec3_addnsec3(dns_db_t *db, dns_dbversion_t *version,
result = dns_db_findrdataset(db, node, version, result = dns_db_findrdataset(db, node, version,
dns_rdatatype_nsec3, 0, dns_rdatatype_nsec3, 0,
(isc_stdtime_t)0, &rdataset, NULL); (isc_stdtime_t)0, &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
continue; continue;
} }
@ -713,7 +713,7 @@ addnsec3:
CHECK(dns_nsec3_buildrdata(db, version, node, hash, flags, iterations, CHECK(dns_nsec3_buildrdata(db, version, node, hash, flags, iterations,
salt, salt_length, nexthash, next_length, salt, salt_length, nexthash, next_length,
nsec3buf, &rdata)); nsec3buf, &rdata));
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
/* /*
* Delete the old NSEC3 and record the change. * Delete the old NSEC3 and record the change.
@ -727,7 +727,7 @@ addnsec3:
CHECK(do_one_tuple(&tuple, db, version, diff)); CHECK(do_one_tuple(&tuple, db, version, diff));
INSIST(tuple == NULL); INSIST(tuple == NULL);
dns_rdata_reset(&rdata); dns_rdata_reset(&rdata);
dns_db_detachnode(db, &newnode); dns_db_detachnode(&newnode);
/* /*
* Add missing NSEC3 records for empty nodes * Add missing NSEC3 records for empty nodes
@ -761,7 +761,7 @@ addnsec3:
result = find_nsec3(&nsec3, &rdataset, nsec3param); result = find_nsec3(&nsec3, &rdataset, nsec3param);
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
if (result == ISC_R_SUCCESS) { if (result == ISC_R_SUCCESS) {
dns_db_detachnode(db, &newnode); dns_db_detachnode(&newnode);
break; break;
} }
} else if (result == ISC_R_NOTFOUND) { } else if (result == ISC_R_NOTFOUND) {
@ -793,7 +793,7 @@ addnsec3:
result = dns_db_findrdataset( result = dns_db_findrdataset(
db, node, version, dns_rdatatype_nsec3, 0, db, node, version, dns_rdatatype_nsec3, 0,
(isc_stdtime_t)0, &rdataset, NULL); (isc_stdtime_t)0, &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
continue; continue;
} }
@ -854,7 +854,7 @@ addnsec3:
CHECK(do_one_tuple(&tuple, db, version, diff)); CHECK(do_one_tuple(&tuple, db, version, diff));
INSIST(tuple == NULL); INSIST(tuple == NULL);
dns_rdata_reset(&rdata); dns_rdata_reset(&rdata);
dns_db_detachnode(db, &newnode); dns_db_detachnode(&newnode);
} while (1); } while (1);
/* result cannot be ISC_R_NOMORE here */ /* result cannot be ISC_R_NOMORE here */
@ -868,10 +868,10 @@ failure:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (newnode != NULL) { if (newnode != NULL) {
dns_db_detachnode(db, &newnode); dns_db_detachnode(&newnode);
} }
return result; return result;
} }
@ -902,7 +902,7 @@ dns_nsec3_addnsec3s(dns_db_t *db, dns_dbversion_t *version,
result = dns_db_findrdataset(db, node, version, result = dns_db_findrdataset(db, node, version,
dns_rdatatype_nsec3param, 0, 0, &rdataset, dns_rdatatype_nsec3param, 0, 0, &rdataset,
NULL); NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_NOTFOUND) { if (result == ISC_R_NOTFOUND) {
return ISC_R_SUCCESS; return ISC_R_SUCCESS;
} }
@ -934,7 +934,7 @@ failure:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
@ -1019,7 +1019,7 @@ rr_exists(dns_db_t *db, dns_dbversion_t *ver, const dns_name_t *name,
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -1174,7 +1174,7 @@ failure:
if (dns_rdataset_isassociated(&rdataset)) { if (dns_rdataset_isassociated(&rdataset)) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -1281,7 +1281,7 @@ failure:
dns_rdataset_disassociate(&prdataset); dns_rdataset_disassociate(&prdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
@ -1389,7 +1389,7 @@ dns_nsec3_delnsec3(dns_db_t *db, dns_dbversion_t *version,
CHECK(dns_dbiterator_pause(dbit)); CHECK(dns_dbiterator_pause(dbit));
result = dns_db_findrdataset(db, node, version, dns_rdatatype_nsec3, 0, result = dns_db_findrdataset(db, node, version, dns_rdatatype_nsec3, 0,
(isc_stdtime_t)0, &rdataset, NULL); (isc_stdtime_t)0, &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_NOTFOUND) { if (result == ISC_R_NOTFOUND) {
goto cleanup_orphaned_ents; goto cleanup_orphaned_ents;
} }
@ -1427,7 +1427,7 @@ dns_nsec3_delnsec3(dns_db_t *db, dns_dbversion_t *version,
result = dns_db_findrdataset(db, node, version, result = dns_db_findrdataset(db, node, version,
dns_rdatatype_nsec3, 0, dns_rdatatype_nsec3, 0,
(isc_stdtime_t)0, &rdataset, NULL); (isc_stdtime_t)0, &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
continue; continue;
} }
@ -1500,7 +1500,7 @@ cleanup_orphaned_ents:
result = dns_db_findrdataset(db, node, version, result = dns_db_findrdataset(db, node, version,
dns_rdatatype_nsec3, 0, dns_rdatatype_nsec3, 0,
(isc_stdtime_t)0, &rdataset, NULL); (isc_stdtime_t)0, &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_NOTFOUND) { if (result == ISC_R_NOTFOUND) {
goto success; goto success;
} }
@ -1531,7 +1531,7 @@ cleanup_orphaned_ents:
result = dns_db_findrdataset( result = dns_db_findrdataset(
db, node, version, dns_rdatatype_nsec3, 0, db, node, version, dns_rdatatype_nsec3, 0,
(isc_stdtime_t)0, &rdataset, NULL); (isc_stdtime_t)0, &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
continue; continue;
} }
@ -1582,7 +1582,7 @@ failure:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -1690,7 +1690,7 @@ failure:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
@ -1728,7 +1728,7 @@ dns_nsec3_activex(dns_db_t *db, dns_dbversion_t *version, bool complete,
} }
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -1748,14 +1748,14 @@ dns_nsec3_activex(dns_db_t *db, dns_dbversion_t *version, bool complete,
try_private: try_private:
if (privatetype == 0 || complete) { if (privatetype == 0 || complete) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
*answer = false; *answer = false;
return ISC_R_SUCCESS; return ISC_R_SUCCESS;
} }
result = dns_db_findrdataset(db, node, version, privatetype, 0, 0, result = dns_db_findrdataset(db, node, version, privatetype, 0, 0,
&rdataset, NULL); &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_NOTFOUND) { if (result == ISC_R_NOTFOUND) {
*answer = false; *answer = false;
return ISC_R_SUCCESS; return ISC_R_SUCCESS;

View File

@ -169,7 +169,7 @@ fetch_done(void *arg) {
dns_resolver_destroyfetch(&resp->fetch); dns_resolver_destroyfetch(&resp->fetch);
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_detach(&resp->db); dns_db_detach(&resp->db);

View File

@ -297,7 +297,7 @@ failure:
dns_rdataset_disassociate(&privateset); dns_rdataset_disassociate(&privateset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }

View File

@ -139,14 +139,20 @@
*/ */
#define DNS_QPDB_EXPIRE_TTL_COUNT 10 #define DNS_QPDB_EXPIRE_TTL_COUNT 10
/*%
* Forward declarations
*/
typedef struct qpcache qpcache_t;
/*% /*%
* This is the structure that is used for each node in the qp trie of * This is the structure that is used for each node in the qp trie of
* trees. * trees.
*/ */
typedef struct qpcnode qpcnode_t; typedef struct qpcnode qpcnode_t;
struct qpcnode { struct qpcnode {
dns_name_t name; DBNODE_FIELDS;
isc_mem_t *mctx;
qpcache_t *qpdb;
uint8_t : 0; uint8_t : 0;
unsigned int delegating : 1; unsigned int delegating : 1;
@ -154,8 +160,6 @@ struct qpcnode {
unsigned int havensec : 1; unsigned int havensec : 1;
uint8_t : 0; uint8_t : 0;
uint16_t locknum;
/* /*
* 'erefs' counts external references held by a caller: for * 'erefs' counts external references held by a caller: for
* example, it could be incremented by dns_db_findnode(), * example, it could be incremented by dns_db_findnode(),
@ -235,7 +239,6 @@ typedef struct qpcache_bucket {
} qpcache_bucket_t; } qpcache_bucket_t;
typedef struct qpcache qpcache_t;
struct qpcache { struct qpcache {
/* Unlocked. */ /* Unlocked. */
dns_db_t common; dns_db_t common;
@ -321,6 +324,31 @@ ISC_REFCOUNT_STATIC_TRACE_DECL(qpcnode);
ISC_REFCOUNT_STATIC_DECL(qpcnode); ISC_REFCOUNT_STATIC_DECL(qpcnode);
#endif #endif
/*
* Node methods forward declarations
*/
static void
qpcnode_attachnode(dns_dbnode_t *source, dns_dbnode_t **targetp DNS__DB_FLARG);
static void
qpcnode_detachnode(dns_dbnode_t **nodep DNS__DB_FLARG);
static void
qpcnode_locknode(dns_dbnode_t *node, isc_rwlocktype_t type);
static void
qpcnode_unlocknode(dns_dbnode_t *node, isc_rwlocktype_t type);
static void
qpcnode_deletedata(dns_dbnode_t *node, void *data);
static void
qpcnode_expiredata(dns_dbnode_t *node, void *data);
static dns_dbnode_methods_t qpcnode_methods = (dns_dbnode_methods_t){
.attachnode = qpcnode_attachnode,
.detachnode = qpcnode_detachnode,
.locknode = qpcnode_locknode,
.unlocknode = qpcnode_unlocknode,
.deletedata = qpcnode_deletedata,
.expiredata = qpcnode_expiredata,
};
/* QP methods */ /* QP methods */
static void static void
qp_attach(void *uctx, void *pval, uint32_t ival); qp_attach(void *uctx, void *pval, uint32_t ival);
@ -844,6 +872,7 @@ mark(dns_slabheader_t *header, uint_least16_t flag) {
uint_least16_t newattributes = 0; uint_least16_t newattributes = 0;
dns_stats_t *stats = NULL; dns_stats_t *stats = NULL;
qpcache_t *qpdb = HEADERNODE(header)->qpdb;
/* /*
* If we are already ancient there is nothing to do. * If we are already ancient there is nothing to do.
*/ */
@ -859,7 +888,7 @@ mark(dns_slabheader_t *header, uint_least16_t flag) {
* Decrement and increment the stats counter for the appropriate * Decrement and increment the stats counter for the appropriate
* RRtype. * RRtype.
*/ */
stats = dns_db_getrrsetstats(header->db); stats = dns_db_getrrsetstats(&qpdb->common);
if (stats != NULL) { if (stats != NULL) {
update_rrsetstats(stats, header->type, attributes, false); update_rrsetstats(stats, header->type, attributes, false);
update_rrsetstats(stats, header->type, newattributes, true); update_rrsetstats(stats, header->type, newattributes, true);
@ -903,7 +932,7 @@ expireheader(dns_slabheader_t *header, isc_rwlocktype_t *nlocktypep,
mark_ancient(header); mark_ancient(header);
if (isc_refcount_current(&HEADERNODE(header)->erefs) == 0) { if (isc_refcount_current(&HEADERNODE(header)->erefs) == 0) {
qpcache_t *qpdb = (qpcache_t *)header->db; qpcache_t *qpdb = HEADERNODE(header)->qpdb;
/* /*
* If no one else is using the node, we can clean it up now. * If no one else is using the node, we can clean it up now.
@ -2160,14 +2189,15 @@ getservestalerefresh(dns_db_t *db, uint32_t *interval) {
} }
static void static void
expiredata(dns_db_t *db, dns_dbnode_t *node, void *data) { qpcnode_expiredata(dns_dbnode_t *node, void *data) {
qpcache_t *qpdb = (qpcache_t *)db;
qpcnode_t *qpnode = (qpcnode_t *)node; qpcnode_t *qpnode = (qpcnode_t *)node;
qpcache_t *qpdb = (qpcache_t *)qpnode->qpdb;
dns_slabheader_t *header = data; dns_slabheader_t *header = data;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none; isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
isc_rwlocktype_t tlocktype = isc_rwlocktype_none; isc_rwlocktype_t tlocktype = isc_rwlocktype_none;
isc_rwlock_t *nlock = &qpdb->buckets[qpnode->locknum].lock;
isc_rwlock_t *nlock = &qpdb->buckets[qpnode->locknum].lock;
NODE_WRLOCK(nlock, &nlocktype); NODE_WRLOCK(nlock, &nlocktype);
expireheader(header, &nlocktype, &tlocktype, expireheader(header, &nlocktype, &tlocktype,
dns_expire_flush DNS__DB_FILELINE); dns_expire_flush DNS__DB_FILELINE);
@ -2333,6 +2363,8 @@ static qpcnode_t *
new_qpcnode(qpcache_t *qpdb, const dns_name_t *name, dns_namespace_t nspace) { new_qpcnode(qpcache_t *qpdb, const dns_name_t *name, dns_namespace_t nspace) {
qpcnode_t *newdata = isc_mem_get(qpdb->common.mctx, sizeof(*newdata)); qpcnode_t *newdata = isc_mem_get(qpdb->common.mctx, sizeof(*newdata));
*newdata = (qpcnode_t){ *newdata = (qpcnode_t){
.methods = &qpcnode_methods,
.qpdb = qpdb,
.name = DNS_NAME_INITEMPTY, .name = DNS_NAME_INITEMPTY,
.nspace = nspace, .nspace = nspace,
.references = ISC_REFCOUNT_INITIALIZER(1), .references = ISC_REFCOUNT_INITIALIZER(1),
@ -2387,53 +2419,6 @@ unlock:
return result; return result;
} }
static void
qpcache_attachnode(dns_db_t *db, dns_dbnode_t *source,
dns_dbnode_t **targetp DNS__DB_FLARG) {
REQUIRE(VALID_QPDB((qpcache_t *)db));
REQUIRE(targetp != NULL && *targetp == NULL);
qpcache_t *qpdb = (qpcache_t *)db;
qpcnode_t *node = (qpcnode_t *)source;
qpcnode_acquire(qpdb, node, isc_rwlocktype_none,
isc_rwlocktype_none DNS__DB_FLARG_PASS);
*targetp = source;
}
static void
qpcache_detachnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG) {
qpcache_t *qpdb = (qpcache_t *)db;
qpcnode_t *node = NULL;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
isc_rwlocktype_t tlocktype = isc_rwlocktype_none;
isc_rwlock_t *nlock = NULL;
REQUIRE(VALID_QPDB(qpdb));
REQUIRE(nodep != NULL && *nodep != NULL);
node = (qpcnode_t *)(*nodep);
*nodep = NULL;
nlock = &qpdb->buckets[node->locknum].lock;
/*
* We can't destroy qpcache while holding a nodelock, so we need to
* reference it before acquiring the lock and release it afterward.
* Additionally, we must ensure that we don't destroy the database while
* the NODE_LOCK is locked.
*/
qpcache_ref(qpdb);
rcu_read_lock();
NODE_RDLOCK(nlock, &nlocktype);
qpcnode_release(qpdb, node, &nlocktype, &tlocktype DNS__DB_FLARG_PASS);
NODE_UNLOCK(nlock, &nlocktype);
rcu_read_unlock();
qpcache_detach(&qpdb);
}
static isc_result_t static isc_result_t
qpcache_createiterator(dns_db_t *db, unsigned int options ISC_ATTR_UNUSED, qpcache_createiterator(dns_db_t *db, unsigned int options ISC_ATTR_UNUSED,
dns_dbiterator_t **iteratorp) { dns_dbiterator_t **iteratorp) {
@ -2504,6 +2489,52 @@ prio_header(dns_slabheader_t *header) {
return prio_type(header->type); return prio_type(header->type);
} }
static void
qpcnode_attachnode(dns_dbnode_t *source, dns_dbnode_t **targetp DNS__DB_FLARG) {
REQUIRE(targetp != NULL && *targetp == NULL);
qpcnode_t *node = (qpcnode_t *)source;
qpcache_t *qpdb = (qpcache_t *)node->qpdb;
qpcnode_acquire(qpdb, node, isc_rwlocktype_none,
isc_rwlocktype_none DNS__DB_FLARG_PASS);
*targetp = source;
}
static void
qpcnode_detachnode(dns_dbnode_t **nodep DNS__DB_FLARG) {
qpcnode_t *node = NULL;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
isc_rwlocktype_t tlocktype = isc_rwlocktype_none;
isc_rwlock_t *nlock = NULL;
REQUIRE(nodep != NULL && *nodep != NULL);
node = (qpcnode_t *)(*nodep);
qpcache_t *qpdb = (qpcache_t *)node->qpdb;
*nodep = NULL;
nlock = &qpdb->buckets[node->locknum].lock;
REQUIRE(VALID_QPDB(qpdb));
/*
* We can't destroy qpcache while holding a nodelock, so we need to
* reference it before acquiring the lock and release it afterward.
* Additionally, we must ensure that we don't destroy the database while
* the NODE_LOCK is locked.
*/
qpcache_ref(qpdb);
rcu_read_lock();
NODE_RDLOCK(nlock, &nlocktype);
qpcnode_release(qpdb, node, &nlocktype, &tlocktype DNS__DB_FLARG_PASS);
NODE_UNLOCK(nlock, &nlocktype);
rcu_read_unlock();
qpcache_detach(&qpdb);
}
static isc_result_t static isc_result_t
add(qpcache_t *qpdb, qpcnode_t *qpnode, add(qpcache_t *qpdb, qpcnode_t *qpnode,
const dns_name_t *nodename ISC_ATTR_UNUSED, dns_slabheader_t *newheader, const dns_name_t *nodename ISC_ATTR_UNUSED, dns_slabheader_t *newheader,
@ -2944,8 +2975,8 @@ qpcache_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
REQUIRE(VALID_QPDB(qpdb)); REQUIRE(VALID_QPDB(qpdb));
REQUIRE(version == NULL); REQUIRE(version == NULL);
result = dns_rdataslab_fromrdataset(rdataset, qpdb->common.mctx, result = dns_rdataslab_fromrdataset(rdataset, qpnode->mctx, &region,
&region, qpdb->maxrrperset); qpdb->maxrrperset);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
if (result == DNS_R_TOOMANYRECORDS) { if (result == DNS_R_TOOMANYRECORDS) {
dns__db_logtoomanyrecords((dns_db_t *)qpdb, dns__db_logtoomanyrecords((dns_db_t *)qpdb,
@ -2987,16 +3018,16 @@ qpcache_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
DNS_SLABHEADER_SETATTR(newheader, DNS_SLABHEADERATTR_OPTOUT); DNS_SLABHEADER_SETATTR(newheader, DNS_SLABHEADERATTR_OPTOUT);
} }
if (rdataset->attributes.noqname) { if (rdataset->attributes.noqname) {
result = addnoqname(qpdb->common.mctx, newheader, result = addnoqname(qpnode->mctx, newheader, qpdb->maxrrperset,
qpdb->maxrrperset, rdataset); rdataset);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_slabheader_destroy(&newheader); dns_slabheader_destroy(&newheader);
return result; return result;
} }
} }
if (rdataset->attributes.closest) { if (rdataset->attributes.closest) {
result = addclosest(qpdb->common.mctx, newheader, result = addclosest(qpnode->mctx, newheader, qpdb->maxrrperset,
qpdb->maxrrperset, rdataset); rdataset);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_slabheader_destroy(&newheader); dns_slabheader_destroy(&newheader);
return result; return result;
@ -3139,17 +3170,17 @@ nodecount(dns_db_t *db, dns_dbtree_t tree) {
} }
static void static void
locknode(dns_db_t *db, dns_dbnode_t *node, isc_rwlocktype_t type) { qpcnode_locknode(dns_dbnode_t *node, isc_rwlocktype_t type) {
qpcache_t *qpdb = (qpcache_t *)db;
qpcnode_t *qpnode = (qpcnode_t *)node; qpcnode_t *qpnode = (qpcnode_t *)node;
qpcache_t *qpdb = qpnode->qpdb;
RWLOCK(&qpdb->buckets[qpnode->locknum].lock, type); RWLOCK(&qpdb->buckets[qpnode->locknum].lock, type);
} }
static void static void
unlocknode(dns_db_t *db, dns_dbnode_t *node, isc_rwlocktype_t type) { qpcnode_unlocknode(dns_dbnode_t *node, isc_rwlocktype_t type) {
qpcache_t *qpdb = (qpcache_t *)db;
qpcnode_t *qpnode = (qpcnode_t *)node; qpcnode_t *qpnode = (qpcnode_t *)node;
qpcache_t *qpdb = qpnode->qpdb;
RWUNLOCK(&qpdb->buckets[qpnode->locknum].lock, type); RWUNLOCK(&qpdb->buckets[qpnode->locknum].lock, type);
} }
@ -3243,8 +3274,7 @@ rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp DNS__DB_FLARG) {
iterator = (qpc_rditer_t *)(*iteratorp); iterator = (qpc_rditer_t *)(*iteratorp);
dns__db_detachnode(iterator->common.db, dns__db_detachnode(&iterator->common.node DNS__DB_FLARG_PASS);
&iterator->common.node DNS__DB_FLARG_PASS);
isc_mem_put(iterator->common.db->mctx, iterator, sizeof(*iterator)); isc_mem_put(iterator->common.db->mctx, iterator, sizeof(*iterator));
*iteratorp = NULL; *iteratorp = NULL;
@ -3702,10 +3732,10 @@ dbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) {
} }
static void static void
deletedata(dns_db_t *db ISC_ATTR_UNUSED, dns_dbnode_t *node ISC_ATTR_UNUSED, qpcnode_deletedata(dns_dbnode_t *node ISC_ATTR_UNUSED, void *data) {
void *data) {
dns_slabheader_t *header = data; dns_slabheader_t *header = data;
qpcache_t *qpdb = (qpcache_t *)header->db; qpcache_t *qpdb = HEADERNODE(header)->qpdb;
int idx = HEADERNODE(header)->locknum; int idx = HEADERNODE(header)->locknum;
if (header->heap != NULL && header->heap_index != 0) { if (header->heap != NULL && header->heap_index != 0) {
@ -3720,10 +3750,10 @@ deletedata(dns_db_t *db ISC_ATTR_UNUSED, dns_dbnode_t *node ISC_ATTR_UNUSED,
} }
if (header->noqname != NULL) { if (header->noqname != NULL) {
dns_slabheader_freeproof(db->mctx, &header->noqname); dns_slabheader_freeproof(qpdb->common.mctx, &header->noqname);
} }
if (header->closest != NULL) { if (header->closest != NULL) {
dns_slabheader_freeproof(db->mctx, &header->closest); dns_slabheader_freeproof(qpdb->common.mctx, &header->closest);
} }
} }
@ -3784,8 +3814,6 @@ static dns_dbmethods_t qpdb_cachemethods = {
.findnode = qpcache_findnode, .findnode = qpcache_findnode,
.find = qpcache_find, .find = qpcache_find,
.findzonecut = qpcache_findzonecut, .findzonecut = qpcache_findzonecut,
.attachnode = qpcache_attachnode,
.detachnode = qpcache_detachnode,
.createiterator = qpcache_createiterator, .createiterator = qpcache_createiterator,
.findrdataset = qpcache_findrdataset, .findrdataset = qpcache_findrdataset,
.allrdatasets = qpcache_allrdatasets, .allrdatasets = qpcache_allrdatasets,
@ -3798,10 +3826,6 @@ static dns_dbmethods_t qpdb_cachemethods = {
.getservestalettl = getservestalettl, .getservestalettl = getservestalettl,
.setservestalerefresh = setservestalerefresh, .setservestalerefresh = setservestalerefresh,
.getservestalerefresh = getservestalerefresh, .getservestalerefresh = getservestalerefresh,
.locknode = locknode,
.unlocknode = unlocknode,
.expiredata = expiredata,
.deletedata = deletedata,
.setmaxrrperset = setmaxrrperset, .setmaxrrperset = setmaxrrperset,
.setmaxtypepername = setmaxtypepername, .setmaxtypepername = setmaxtypepername,
}; };

View File

@ -172,11 +172,10 @@ typedef struct qpz_heap {
ISC_REFCOUNT_STATIC_DECL(qpz_heap); ISC_REFCOUNT_STATIC_DECL(qpz_heap);
struct qpznode { struct qpznode {
dns_name_t name; DBNODE_FIELDS;
isc_mem_t *mctx;
qpz_heap_t *heap; qpz_heap_t *heap;
qpzonedb_t *qpdb;
/* /*
* 'erefs' counts external references held by a caller: for * 'erefs' counts external references held by a caller: for
* example, it could be incremented by dns_db_findnode(), * example, it could be incremented by dns_db_findnode(),
@ -202,7 +201,6 @@ struct qpznode {
isc_refcount_t references; isc_refcount_t references;
isc_refcount_t erefs; isc_refcount_t erefs;
uint16_t locknum;
_Atomic(dns_namespace_t) nspace; _Atomic(dns_namespace_t) nspace;
atomic_bool havensec; atomic_bool havensec;
atomic_bool wild; atomic_bool wild;
@ -297,6 +295,7 @@ typedef struct {
} qpz_load_t; } qpz_load_t;
static dns_dbmethods_t qpdb_zonemethods; static dns_dbmethods_t qpdb_zonemethods;
static dns_dbnode_methods_t qpznode_methods;
#if DNS_DB_NODETRACE #if DNS_DB_NODETRACE
#define qpznode_ref(ptr) qpznode__ref(ptr, __func__, __FILE__, __LINE__) #define qpznode_ref(ptr) qpznode__ref(ptr, __func__, __FILE__, __LINE__)
@ -665,10 +664,12 @@ static qpznode_t *
new_qpznode(qpzonedb_t *qpdb, const dns_name_t *name, dns_namespace_t nspace) { new_qpznode(qpzonedb_t *qpdb, const dns_name_t *name, dns_namespace_t nspace) {
qpznode_t *newdata = isc_mem_get(qpdb->common.mctx, sizeof(*newdata)); qpznode_t *newdata = isc_mem_get(qpdb->common.mctx, sizeof(*newdata));
*newdata = (qpznode_t){ *newdata = (qpznode_t){
.methods = &qpznode_methods,
.name = DNS_NAME_INITEMPTY, .name = DNS_NAME_INITEMPTY,
.nspace = nspace, .nspace = nspace,
.heap = qpdb->heap, .heap = qpdb->heap,
.references = ISC_REFCOUNT_INITIALIZER(1), .references = ISC_REFCOUNT_INITIALIZER(1),
.qpdb = qpdb,
.locknum = qpzone_get_locknum(), .locknum = qpzone_get_locknum(),
}; };
@ -1329,7 +1330,7 @@ resigninsert(dns_slabheader_t *newheader) {
} }
static void static void
resigndelete(qpzonedb_t *qpdb, qpz_version_t *version, resigndelete(qpzonedb_t *qpdb ISC_ATTR_UNUSED, qpz_version_t *version,
dns_slabheader_t *header DNS__DB_FLARG) { dns_slabheader_t *header DNS__DB_FLARG) {
if (header == NULL || header->heap_index == 0) { if (header == NULL || header->heap_index == 0) {
return; return;
@ -1832,8 +1833,8 @@ cname_and_other(qpznode_t *node, uint32_t serial) {
static qpz_changed_t * static qpz_changed_t *
add_changed(dns_slabheader_t *header, qpz_version_t *version DNS__DB_FLARG) { add_changed(dns_slabheader_t *header, qpz_version_t *version DNS__DB_FLARG) {
qpz_changed_t *changed = NULL; qpz_changed_t *changed = NULL;
qpzonedb_t *qpdb = (qpzonedb_t *)header->db; qpznode_t *node = HEADERNODE(header);
qpznode_t *node = (qpznode_t *)header->node; qpzonedb_t *qpdb = node->qpdb;
changed = isc_mem_get(qpdb->common.mctx, sizeof(*changed)); changed = isc_mem_get(qpdb->common.mctx, sizeof(*changed));
@ -2214,8 +2215,8 @@ loading_addrdataset(void *arg, const dns_name_t *name,
} }
loading_addnode(loadctx, name, rdataset->type, rdataset->covers, &node); loading_addnode(loadctx, name, rdataset->type, rdataset->covers, &node);
result = dns_rdataslab_fromrdataset(rdataset, qpdb->common.mctx, result = dns_rdataslab_fromrdataset(rdataset, node->mctx, &region,
&region, qpdb->maxrrperset); qpdb->maxrrperset);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
if (result == DNS_R_TOOMANYRECORDS) { if (result == DNS_R_TOOMANYRECORDS) {
dns__db_logtoomanyrecords((dns_db_t *)qpdb, name, dns__db_logtoomanyrecords((dns_db_t *)qpdb, name,
@ -3968,10 +3969,9 @@ qpzone_allrdatasets(dns_db_t *db, dns_dbnode_t *dbnode,
} }
static void static void
qpzone_attachnode(dns_db_t *db, dns_dbnode_t *source, qpzone_attachnode(dns_dbnode_t *source, dns_dbnode_t **targetp DNS__DB_FLARG) {
dns_dbnode_t **targetp DNS__DB_FLARG) {
qpzonedb_t *qpdb = (qpzonedb_t *)db;
qpznode_t *node = (qpznode_t *)source; qpznode_t *node = (qpznode_t *)source;
qpzonedb_t *qpdb = node->qpdb;
REQUIRE(VALID_QPZONE(qpdb)); REQUIRE(VALID_QPZONE(qpdb));
REQUIRE(targetp != NULL && *targetp == NULL); REQUIRE(targetp != NULL && *targetp == NULL);
@ -3982,16 +3982,18 @@ qpzone_attachnode(dns_db_t *db, dns_dbnode_t *source,
} }
static void static void
qpzone_detachnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG) { qpzone_detachnode(dns_dbnode_t **nodep DNS__DB_FLARG) {
qpzonedb_t *qpdb = (qpzonedb_t *)db;
qpznode_t *node = NULL; qpznode_t *node = NULL;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none; isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
isc_rwlock_t *nlock = NULL; isc_rwlock_t *nlock = NULL;
qpzonedb_t *qpdb;
REQUIRE(VALID_QPZONE(qpdb));
REQUIRE(nodep != NULL && *nodep != NULL); REQUIRE(nodep != NULL && *nodep != NULL);
node = (qpznode_t *)(*nodep); node = (qpznode_t *)(*nodep);
qpdb = node->qpdb;
REQUIRE(VALID_QPZONE(qpdb));
*nodep = NULL; *nodep = NULL;
nlock = qpzone_get_lock(node); nlock = qpzone_get_lock(node);
@ -4061,24 +4063,21 @@ getoriginnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG) {
} }
static void static void
locknode(dns_db_t *db ISC_ATTR_UNUSED, dns_dbnode_t *dbnode, locknode(dns_dbnode_t *dbnode, isc_rwlocktype_t type) {
isc_rwlocktype_t type) {
qpznode_t *node = (qpznode_t *)dbnode; qpznode_t *node = (qpznode_t *)dbnode;
RWLOCK(qpzone_get_lock(node), type); RWLOCK(qpzone_get_lock(node), type);
} }
static void static void
unlocknode(dns_db_t *db ISC_ATTR_UNUSED, dns_dbnode_t *dbnode, unlocknode(dns_dbnode_t *dbnode, isc_rwlocktype_t type) {
isc_rwlocktype_t type) {
qpznode_t *node = (qpznode_t *)dbnode; qpznode_t *node = (qpznode_t *)dbnode;
RWUNLOCK(qpzone_get_lock(node), type); RWUNLOCK(qpzone_get_lock(node), type);
} }
static void static void
deletedata(dns_db_t *db ISC_ATTR_UNUSED, dns_dbnode_t *node ISC_ATTR_UNUSED, deletedata(dns_dbnode_t *node ISC_ATTR_UNUSED, void *data) {
void *data) {
dns_slabheader_t *header = data; dns_slabheader_t *header = data;
if (header->heap_index != 0) { if (header->heap_index != 0) {
@ -4104,8 +4103,7 @@ rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp DNS__DB_FLARG) {
closeversion(qrditer->common.db, &qrditer->common.version, closeversion(qrditer->common.db, &qrditer->common.version,
false DNS__DB_FLARG_PASS); false DNS__DB_FLARG_PASS);
} }
dns__db_detachnode(qrditer->common.db, dns__db_detachnode(&qrditer->common.node DNS__DB_FLARG_PASS);
&qrditer->common.node DNS__DB_FLARG_PASS);
isc_mem_put(qrditer->common.db->mctx, qrditer, sizeof(*qrditer)); isc_mem_put(qrditer->common.db->mctx, qrditer, sizeof(*qrditer));
*iteratorp = NULL; *iteratorp = NULL;
@ -4829,8 +4827,8 @@ qpzone_addrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
rdataset->type != dns_rdatatype_nsec3 && rdataset->type != dns_rdatatype_nsec3 &&
rdataset->covers != dns_rdatatype_nsec3)); rdataset->covers != dns_rdatatype_nsec3));
result = dns_rdataslab_fromrdataset(rdataset, qpdb->common.mctx, result = dns_rdataslab_fromrdataset(rdataset, node->mctx, &region,
&region, qpdb->maxrrperset); qpdb->maxrrperset);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
if (result == DNS_R_TOOMANYRECORDS) { if (result == DNS_R_TOOMANYRECORDS) {
dns__db_logtoomanyrecords((dns_db_t *)qpdb, &node->name, dns__db_logtoomanyrecords((dns_db_t *)qpdb, &node->name,
@ -4951,8 +4949,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
rdataset->covers != dns_rdatatype_nsec3)); rdataset->covers != dns_rdatatype_nsec3));
dns_name_copy(&node->name, nodename); dns_name_copy(&node->name, nodename);
result = dns_rdataslab_fromrdataset(rdataset, qpdb->common.mctx, result = dns_rdataslab_fromrdataset(rdataset, node->mctx, &region, 0);
&region, 0);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
return result; return result;
} }
@ -5143,13 +5140,11 @@ qpzone_deleterdataset(dns_db_t *db, dns_dbnode_t *dbnode,
} }
static isc_result_t static isc_result_t
nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name) { nodefullname(dns_dbnode_t *node, dns_name_t *name) {
qpzonedb_t *qpdb = (qpzonedb_t *)db;
qpznode_t *qpnode = (qpznode_t *)node; qpznode_t *qpnode = (qpznode_t *)node;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none; isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
isc_rwlock_t *nlock = NULL; isc_rwlock_t *nlock = NULL;
REQUIRE(VALID_QPZONE(qpdb));
REQUIRE(node != NULL); REQUIRE(node != NULL);
REQUIRE(name != NULL); REQUIRE(name != NULL);
@ -5305,12 +5300,10 @@ glue_nsdname_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype,
} }
if (node_a != NULL) { if (node_a != NULL) {
dns__db_detachnode(ctx->db, dns__db_detachnode((dns_dbnode_t **)&node_a DNS__DB_FLARG_PASS);
(dns_dbnode_t **)&node_a DNS__DB_FLARG_PASS);
} }
if (node_aaaa != NULL) { if (node_aaaa != NULL) {
dns__db_detachnode( dns__db_detachnode(
ctx->db,
(dns_dbnode_t **)&node_aaaa DNS__DB_FLARG_PASS); (dns_dbnode_t **)&node_aaaa DNS__DB_FLARG_PASS);
} }
@ -5511,8 +5504,6 @@ static dns_dbmethods_t qpdb_zonemethods = {
.closeversion = closeversion, .closeversion = closeversion,
.findnode = qpzone_findnode, .findnode = qpzone_findnode,
.find = qpzone_find, .find = qpzone_find,
.attachnode = qpzone_attachnode,
.detachnode = qpzone_detachnode,
.createiterator = qpzone_createiterator, .createiterator = qpzone_createiterator,
.findrdataset = qpzone_findrdataset, .findrdataset = qpzone_findrdataset,
.allrdatasets = qpzone_allrdatasets, .allrdatasets = qpzone_allrdatasets,
@ -5529,15 +5520,20 @@ static dns_dbmethods_t qpdb_zonemethods = {
.getsigningtime = getsigningtime, .getsigningtime = getsigningtime,
.getsize = getsize, .getsize = getsize,
.setgluecachestats = setgluecachestats, .setgluecachestats = setgluecachestats,
.locknode = locknode,
.unlocknode = unlocknode,
.addglue = addglue, .addglue = addglue,
.deletedata = deletedata,
.nodefullname = nodefullname,
.setmaxrrperset = setmaxrrperset, .setmaxrrperset = setmaxrrperset,
.setmaxtypepername = setmaxtypepername, .setmaxtypepername = setmaxtypepername,
}; };
static dns_dbnode_methods_t qpznode_methods = (dns_dbnode_methods_t){
.nodefullname = nodefullname,
.attachnode = qpzone_attachnode,
.detachnode = qpzone_detachnode,
.locknode = locknode,
.unlocknode = unlocknode,
.deletedata = deletedata,
};
static void static void
destroy_qpznode(qpznode_t *node) { destroy_qpznode(qpznode_t *node) {
dns_slabheader_t *current = NULL, *next = NULL; dns_slabheader_t *current = NULL, *next = NULL;

View File

@ -863,7 +863,6 @@ dns_slabheader_reset(dns_slabheader_t *h, dns_db_t *db, dns_dbnode_t *node) {
ISC_LINK_INIT(h, link); ISC_LINK_INIT(h, link);
h->heap_index = 0; h->heap_index = 0;
h->heap = NULL; h->heap = NULL;
h->db = db;
h->node = node; h->node = node;
h->visited = false; h->visited = false;
@ -894,9 +893,8 @@ dns_slabheader_destroy(dns_slabheader_t **headerp) {
*headerp = NULL; *headerp = NULL;
isc_mem_t *mctx = header->db->mctx; isc_mem_t *mctx = header->node->mctx;
dns_db_deletedata(header->node, header);
dns_db_deletedata(header->db, header->node, header);
if (NONEXISTENT(header)) { if (NONEXISTENT(header)) {
size = sizeof(*header); size = sizeof(*header);
@ -967,10 +965,9 @@ dns_slabheader_top(dns_slabheader_t *header) {
static void static void
rdataset_disassociate(dns_rdataset_t *rdataset DNS__DB_FLARG) { rdataset_disassociate(dns_rdataset_t *rdataset DNS__DB_FLARG) {
dns_db_t *db = rdataset->slab.db;
dns_dbnode_t *node = rdataset->slab.node; dns_dbnode_t *node = rdataset->slab.node;
dns__db_detachnode(db, &node DNS__DB_FLARG_PASS); dns__db_detachnode(&node DNS__DB_FLARG_PASS);
} }
static isc_result_t static isc_result_t
@ -1049,11 +1046,10 @@ rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
static void static void
rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target DNS__DB_FLARG) { rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target DNS__DB_FLARG) {
dns_db_t *db = source->slab.db;
dns_dbnode_t *node = source->slab.node; dns_dbnode_t *node = source->slab.node;
dns_dbnode_t *cloned_node = NULL; dns_dbnode_t *cloned_node = NULL;
dns__db_attachnode(db, node, &cloned_node DNS__DB_FLARG_PASS); dns__db_attachnode(node, &cloned_node DNS__DB_FLARG_PASS);
INSIST(!ISC_LINK_LINKED(target, link)); INSIST(!ISC_LINK_LINKED(target, link));
*target = *source; *target = *source;
ISC_LINK_INIT(target, link); ISC_LINK_INIT(target, link);
@ -1086,8 +1082,7 @@ rdataset_getnoqname(dns_rdataset_t *rdataset, dns_name_t *name,
* getownercase methods from affecting the case of NSEC/NSEC3 * getownercase methods from affecting the case of NSEC/NSEC3
* owner names. * owner names.
*/ */
dns__db_attachnode(db, node, dns__db_attachnode(node, &(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
&(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
*nsec = (dns_rdataset_t){ *nsec = (dns_rdataset_t){
.methods = &dns_rdataslab_rdatasetmethods, .methods = &dns_rdataslab_rdatasetmethods,
.rdclass = db->rdclass, .rdclass = db->rdclass,
@ -1104,8 +1099,7 @@ rdataset_getnoqname(dns_rdataset_t *rdataset, dns_name_t *name,
}; };
nsec->attributes.keepcase = true; nsec->attributes.keepcase = true;
dns__db_attachnode(db, node, dns__db_attachnode(node, &(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
&(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
*nsecsig = (dns_rdataset_t){ *nsecsig = (dns_rdataset_t){
.methods = &dns_rdataslab_rdatasetmethods, .methods = &dns_rdataslab_rdatasetmethods,
.rdclass = db->rdclass, .rdclass = db->rdclass,
@ -1141,8 +1135,7 @@ rdataset_getclosest(dns_rdataset_t *rdataset, dns_name_t *name,
* following an dns_slabheader, but in this case it points to a bare * following an dns_slabheader, but in this case it points to a bare
* rdataslab belonging to the dns_slabheader's `closest` field. * rdataslab belonging to the dns_slabheader's `closest` field.
*/ */
dns__db_attachnode(db, node, dns__db_attachnode(node, &(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
&(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
*nsec = (dns_rdataset_t){ *nsec = (dns_rdataset_t){
.methods = &dns_rdataslab_rdatasetmethods, .methods = &dns_rdataslab_rdatasetmethods,
.rdclass = db->rdclass, .rdclass = db->rdclass,
@ -1159,8 +1152,7 @@ rdataset_getclosest(dns_rdataset_t *rdataset, dns_name_t *name,
}; };
nsec->attributes.keepcase = true; nsec->attributes.keepcase = true;
dns__db_attachnode(db, node, dns__db_attachnode(node, &(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
&(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
*nsecsig = (dns_rdataset_t){ *nsecsig = (dns_rdataset_t){
.methods = &dns_rdataslab_rdatasetmethods, .methods = &dns_rdataslab_rdatasetmethods,
.rdclass = db->rdclass, .rdclass = db->rdclass,
@ -1187,25 +1179,25 @@ static void
rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) { rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) {
dns_slabheader_t *header = dns_rdataset_getheader(rdataset); dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_db_locknode(header->db, header->node, isc_rwlocktype_write); dns_db_locknode(header->node, isc_rwlocktype_write);
header->trust = rdataset->trust = trust; header->trust = rdataset->trust = trust;
dns_db_unlocknode(header->db, header->node, isc_rwlocktype_write); dns_db_unlocknode(header->node, isc_rwlocktype_write);
} }
static void static void
rdataset_expire(dns_rdataset_t *rdataset DNS__DB_FLARG) { rdataset_expire(dns_rdataset_t *rdataset DNS__DB_FLARG) {
dns_slabheader_t *header = dns_rdataset_getheader(rdataset); dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_db_expiredata(header->db, header->node, header); dns_db_expiredata(header->node, header);
} }
static void static void
rdataset_clearprefetch(dns_rdataset_t *rdataset) { rdataset_clearprefetch(dns_rdataset_t *rdataset) {
dns_slabheader_t *header = dns_rdataset_getheader(rdataset); dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_db_locknode(header->db, header->node, isc_rwlocktype_write); dns_db_locknode(header->node, isc_rwlocktype_write);
DNS_SLABHEADER_CLRATTR(header, DNS_SLABHEADERATTR_PREFETCH); DNS_SLABHEADER_CLRATTR(header, DNS_SLABHEADERATTR_PREFETCH);
dns_db_unlocknode(header->db, header->node, isc_rwlocktype_write); dns_db_unlocknode(header->node, isc_rwlocktype_write);
} }
static void static void
@ -1214,9 +1206,9 @@ rdataset_setownercase(dns_rdataset_t *rdataset, const dns_name_t *name) {
DNS_SLABHEADER_CLRATTR(header, DNS_SLABHEADERATTR_CASEFULLYLOWER); DNS_SLABHEADER_CLRATTR(header, DNS_SLABHEADERATTR_CASEFULLYLOWER);
dns_db_locknode(header->db, header->node, isc_rwlocktype_write); dns_db_locknode(header->node, isc_rwlocktype_write);
dns_slabheader_setownercase(header, name); dns_slabheader_setownercase(header, name);
dns_db_unlocknode(header->db, header->node, isc_rwlocktype_write); dns_db_unlocknode(header->node, isc_rwlocktype_write);
} }
static void static void
@ -1230,7 +1222,7 @@ rdataset_getownercase(const dns_rdataset_t *rdataset, dns_name_t *name) {
return; return;
} }
dns_db_locknode(header->db, header->node, isc_rwlocktype_read); dns_db_locknode(header->node, isc_rwlocktype_read);
if (CASESET(header)) { if (CASESET(header)) {
uint8_t *nd = name->ndata; uint8_t *nd = name->ndata;
for (size_t i = 0; i < name->length; i++) { for (size_t i = 0; i < name->length; i++) {
@ -1244,7 +1236,7 @@ rdataset_getownercase(const dns_rdataset_t *rdataset, dns_name_t *name) {
: isc_ascii_tolower(nd[i]); : isc_ascii_tolower(nd[i]);
} }
} }
dns_db_unlocknode(header->db, header->node, isc_rwlocktype_read); dns_db_unlocknode(header->node, isc_rwlocktype_read);
} }
static dns_slabheader_t * static dns_slabheader_t *

View File

@ -4113,8 +4113,8 @@ resume_qmin(void *arg) {
dns_rdataset_init(&sigrdataset); dns_rdataset_init(&sigrdataset);
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_attachnode(resp->db, resp->node, &node); dns_db_attachnode(resp->node, &node);
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_attach(resp->db, &db); dns_db_attach(resp->db, &db);
@ -4183,8 +4183,7 @@ resume_qmin(void *arg) {
dns_db_attach(db, &resp->db); dns_db_attach(db, &resp->db);
} }
if (node != NULL) { if (node != NULL) {
dns_db_attachnode(db, node, dns_db_attachnode(node, &resp->node);
&resp->node);
} }
dns_name_copy(fname, resp->foundname); dns_name_copy(fname, resp->foundname);
clone_results(fctx); clone_results(fctx);
@ -4251,8 +4250,7 @@ resume_qmin(void *arg) {
dns_db_attach(db, &resp->db); dns_db_attach(db, &resp->db);
} }
if (node != NULL) { if (node != NULL) {
dns_db_attachnode(db, node, dns_db_attachnode(node, &resp->node);
&resp->node);
} }
dns_name_copy(fname, resp->foundname); dns_name_copy(fname, resp->foundname);
if (result == DNS_R_CNAME && if (result == DNS_R_CNAME &&
@ -4347,7 +4345,7 @@ resume_qmin(void *arg) {
cleanup: cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (db != NULL) { if (db != NULL) {
dns_db_detach(&db); dns_db_detach(&db);
@ -5039,7 +5037,7 @@ clone_results(fetchctx_t *fctx) {
resp->result = hresp->result; resp->result = hresp->result;
dns_name_copy(hresp->foundname, resp->foundname); dns_name_copy(hresp->foundname, resp->foundname);
dns_db_attach(hresp->db, &resp->db); dns_db_attach(hresp->db, &resp->db);
dns_db_attachnode(hresp->db, hresp->node, &resp->node); dns_db_attachnode(hresp->node, &resp->node);
INSIST(hresp->rdataset != NULL && resp->rdataset != NULL); INSIST(hresp->rdataset != NULL && resp->rdataset != NULL);
if (dns_rdataset_isassociated(hresp->rdataset)) { if (dns_rdataset_isassociated(hresp->rdataset)) {
@ -5258,7 +5256,7 @@ cache_rrset(fetchctx_t *fctx, isc_stdtime_t now, dns_name_t *name,
* detach it before returning. * detach it before returning.
*/ */
if (nodep != NULL && *nodep != NULL) { if (nodep != NULL && *nodep != NULL) {
dns_db_attachnode(fctx->cache, *nodep, &node); dns_db_attachnode(*nodep, &node);
} else { } else {
result = dns_db_findnode(fctx->cache, name, true, &node); result = dns_db_findnode(fctx->cache, name, true, &node);
} }
@ -5284,7 +5282,7 @@ cache_rrset(fetchctx_t *fctx, isc_stdtime_t now, dns_name_t *name,
if (nodep != NULL && *nodep == NULL) { if (nodep != NULL && *nodep == NULL) {
*nodep = node; *nodep = node;
} else if (node != NULL) { } else if (node != NULL) {
dns_db_detachnode(fctx->cache, &node); dns_db_detachnode(&node);
} }
return result; return result;
@ -5306,7 +5304,7 @@ delete_rrset(fetchctx_t *fctx, dns_name_t *name, dns_rdatatype_t type,
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(fctx->cache, &node); dns_db_detachnode(&node);
} }
} }
@ -5583,7 +5581,7 @@ cleanup:
cleanup_unlocked: cleanup_unlocked:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(fctx->cache, &node); dns_db_detachnode(&node);
} }
if (nextval != NULL) { if (nextval != NULL) {
@ -6069,7 +6067,7 @@ rctx_cachename(respctx_t *rctx, dns_message_t *message, dns_name_t *name) {
cleanup: cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(fctx->cache, &node); dns_db_detachnode(&node);
} }
return result; return result;
@ -6269,7 +6267,7 @@ unlock:
UNLOCK(&fctx->lock); UNLOCK(&fctx->lock);
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(fctx->cache, &node); dns_db_detachnode(&node);
} }
done: done:
@ -6731,7 +6729,7 @@ resume_dslookup(void *arg) {
FCTXTRACE("resume_dslookup"); FCTXTRACE("resume_dslookup");
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_detach(&resp->db); dns_db_detach(&resp->db);
@ -9666,7 +9664,7 @@ prime_done(void *arg) {
} }
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_detach(&resp->db); dns_db_detach(&resp->db);

View File

@ -182,7 +182,7 @@ check_hints(dns_db_t *db) {
goto cleanup; goto cleanup;
} }
dns_rdatasetiter_destroy(&rdsiter); dns_rdatasetiter_destroy(&rdsiter);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
cleanup: cleanup:
@ -193,7 +193,7 @@ cleanup:
dns_rdatasetiter_destroy(&rdsiter); dns_rdatasetiter_destroy(&rdsiter);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (dbiter != NULL) { if (dbiter != NULL) {
dns_dbiterator_destroy(&dbiter); dns_dbiterator_destroy(&dbiter);

View File

@ -1775,14 +1775,14 @@ update_nodes(dns_rpz_zone_t *rpz, isc_ht_t *newnodes) {
"rpz: %s: failed to fetch " "rpz: %s: failed to fetch "
"rrdatasets - %s", "rrdatasets - %s",
domain, isc_result_totext(result)); domain, isc_result_totext(result));
dns_db_detachnode(rpz->updb, &node); dns_db_detachnode(&node);
goto cleanup; goto cleanup;
} }
result = dns_rdatasetiter_first(rdsiter); result = dns_rdatasetiter_first(rdsiter);
dns_rdatasetiter_destroy(&rdsiter); dns_rdatasetiter_destroy(&rdsiter);
dns_db_detachnode(rpz->updb, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { /* skip empty non-terminal */ if (result != ISC_R_SUCCESS) { /* skip empty non-terminal */
if (result != ISC_R_NOMORE) { if (result != ISC_R_NOMORE) {

View File

@ -68,7 +68,7 @@ dns_rriterator_first(dns_rriterator_t *it) {
dns_rdatasetiter_destroy(&it->rdatasetit); dns_rdatasetiter_destroy(&it->rdatasetit);
} }
if (it->node != NULL) { if (it->node != NULL) {
dns_db_detachnode(it->db, &it->node); dns_db_detachnode(&it->node);
} }
it->result = dns_dbiterator_first(it->dbit); it->result = dns_dbiterator_first(it->dbit);
@ -96,7 +96,7 @@ dns_rriterator_first(dns_rriterator_t *it) {
* This node is empty. Try next node. * This node is empty. Try next node.
*/ */
dns_rdatasetiter_destroy(&it->rdatasetit); dns_rdatasetiter_destroy(&it->rdatasetit);
dns_db_detachnode(it->db, &it->node); dns_db_detachnode(&it->node);
it->result = dns_dbiterator_next(it->dbit); it->result = dns_dbiterator_next(it->dbit);
continue; continue;
} }
@ -122,7 +122,7 @@ dns_rriterator_nextrrset(dns_rriterator_t *it) {
*/ */
while (it->result == ISC_R_NOMORE) { while (it->result == ISC_R_NOMORE) {
dns_rdatasetiter_destroy(&it->rdatasetit); dns_rdatasetiter_destroy(&it->rdatasetit);
dns_db_detachnode(it->db, &it->node); dns_db_detachnode(&it->node);
it->result = dns_dbiterator_next(it->dbit); it->result = dns_dbiterator_next(it->dbit);
if (it->result == ISC_R_NOMORE) { if (it->result == ISC_R_NOMORE) {
/* We are at the end of the entire database. */ /* We are at the end of the entire database. */
@ -188,7 +188,7 @@ dns_rriterator_destroy(dns_rriterator_t *it) {
dns_rdatasetiter_destroy(&it->rdatasetit); dns_rdatasetiter_destroy(&it->rdatasetit);
} }
if (it->node != NULL) { if (it->node != NULL) {
dns_db_detachnode(it->db, &it->node); dns_db_detachnode(&it->node);
} }
dns_dbiterator_destroy(&it->dbit); dns_dbiterator_destroy(&it->dbit);
} }

View File

@ -105,11 +105,11 @@ struct dns_sdlz_db {
struct dns_sdlzlookup { struct dns_sdlzlookup {
/* Unlocked */ /* Unlocked */
unsigned int magic; DBNODE_FIELDS;
dns_sdlz_db_t *sdlz; dns_sdlz_db_t *sdlz;
ISC_LIST(dns_rdatalist_t) lists; ISC_LIST(dns_rdatalist_t) lists;
ISC_LIST(isc_buffer_t) buffers; ISC_LIST(isc_buffer_t) buffers;
dns_name_t name;
ISC_LINK(dns_sdlzlookup_t) link; ISC_LINK(dns_sdlzlookup_t) link;
dns_rdatacallbacks_t callbacks; dns_rdatacallbacks_t callbacks;
@ -187,8 +187,18 @@ static void
list_tordataset(dns_rdatalist_t *rdatalist, dns_db_t *db, dns_dbnode_t *node, list_tordataset(dns_rdatalist_t *rdatalist, dns_db_t *db, dns_dbnode_t *node,
dns_rdataset_t *rdataset); dns_rdataset_t *rdataset);
/*
* Node methods forward declarations
*/
static void static void
detachnode(dns_db_t *db, dns_dbnode_t **targetp DNS__DB_FLARG); sdlznode_attachnode(dns_dbnode_t *source, dns_dbnode_t **targetp DNS__DB_FLARG);
static void
sdlznode_detachnode(dns_dbnode_t **targetp DNS__DB_FLARG);
static dns_dbnode_methods_t sdlznode_methods = (dns_dbnode_methods_t){
.attachnode = sdlznode_attachnode,
.detachnode = sdlznode_detachnode,
};
static void static void
dbiterator_destroy(dns_dbiterator_t **iteratorp DNS__DB_FLARG); dbiterator_destroy(dns_dbiterator_t **iteratorp DNS__DB_FLARG);
@ -248,8 +258,7 @@ static void
rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp DNS__DB_FLARG) { rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp DNS__DB_FLARG) {
sdlz_rdatasetiter_t *sdlziterator = (sdlz_rdatasetiter_t *)(*iteratorp); sdlz_rdatasetiter_t *sdlziterator = (sdlz_rdatasetiter_t *)(*iteratorp);
detachnode(sdlziterator->common.db, sdlznode_detachnode(&sdlziterator->common.node DNS__DB_FLARG_PASS);
&sdlziterator->common.node DNS__DB_FLARG_PASS);
isc_mem_put(sdlziterator->common.db->mctx, sdlziterator, isc_mem_put(sdlziterator->common.db->mctx, sdlziterator,
sizeof(sdlz_rdatasetiter_t)); sizeof(sdlz_rdatasetiter_t));
*iteratorp = NULL; *iteratorp = NULL;
@ -396,6 +405,7 @@ createnode(dns_sdlz_db_t *sdlz, dns_sdlznode_t **nodep) {
node = isc_mem_get(sdlz->common.mctx, sizeof(dns_sdlznode_t)); node = isc_mem_get(sdlz->common.mctx, sizeof(dns_sdlznode_t));
node->methods = &sdlznode_methods;
node->sdlz = NULL; node->sdlz = NULL;
dns_db_attach((dns_db_t *)sdlz, (dns_db_t **)&node->sdlz); dns_db_attach((dns_db_t *)sdlz, (dns_db_t **)&node->sdlz);
ISC_LIST_INIT(node->lists); ISC_LIST_INIT(node->lists);
@ -622,16 +632,11 @@ findnode(dns_db_t *db, const dns_name_t *name, bool create,
} }
static void static void
attachnode(dns_db_t *db, dns_dbnode_t *source, sdlznode_attachnode(dns_dbnode_t *source,
dns_dbnode_t **targetp DNS__DB_FLARG) { dns_dbnode_t **targetp DNS__DB_FLARG) {
dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
dns_sdlznode_t *node = (dns_sdlznode_t *)source; dns_sdlznode_t *node = (dns_sdlznode_t *)source;
uint_fast32_t refs; uint_fast32_t refs;
REQUIRE(VALID_SDLZDB(sdlz));
UNUSED(sdlz);
refs = isc_refcount_increment(&node->references); refs = isc_refcount_increment(&node->references);
#if DNS_DB_NODETRACE #if DNS_DB_NODETRACE
fprintf(stderr, "incr:node:%s:%s:%u:%p->references = %" PRIuFAST32 "\n", fprintf(stderr, "incr:node:%s:%s:%u:%p->references = %" PRIuFAST32 "\n",
@ -644,16 +649,12 @@ attachnode(dns_db_t *db, dns_dbnode_t *source,
} }
static void static void
detachnode(dns_db_t *db, dns_dbnode_t **targetp DNS__DB_FLARG) { sdlznode_detachnode(dns_dbnode_t **targetp DNS__DB_FLARG) {
dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
dns_sdlznode_t *node; dns_sdlznode_t *node;
uint_fast32_t refs; uint_fast32_t refs;
REQUIRE(VALID_SDLZDB(sdlz));
REQUIRE(targetp != NULL && *targetp != NULL); REQUIRE(targetp != NULL && *targetp != NULL);
UNUSED(sdlz);
node = (dns_sdlznode_t *)(*targetp); node = (dns_sdlznode_t *)(*targetp);
*targetp = NULL; *targetp = NULL;
@ -878,7 +879,7 @@ findext(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
* and try again. * and try again.
*/ */
if (i < nlabels) { if (i < nlabels) {
detachnode(db, &node DNS__DB_FLARG_PASS); sdlznode_detachnode(&node DNS__DB_FLARG_PASS);
node = NULL; node = NULL;
continue; continue;
} }
@ -928,7 +929,7 @@ findext(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
if (nodep != NULL) { if (nodep != NULL) {
*nodep = node; *nodep = node;
} else if (node != NULL) { } else if (node != NULL) {
detachnode(db, &node DNS__DB_FLARG_PASS); sdlznode_detachnode(&node DNS__DB_FLARG_PASS);
} }
return result; return result;
@ -964,7 +965,8 @@ allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
iterator->common.methods = &rdatasetiter_methods; iterator->common.methods = &rdatasetiter_methods;
iterator->common.db = db; iterator->common.db = db;
iterator->common.node = NULL; iterator->common.node = NULL;
attachnode(db, node, &iterator->common.node DNS__DB_FLARG_PASS); sdlznode_attachnode((dns_dbnode_t *)node,
&iterator->common.node DNS__DB_FLARG_PASS);
iterator->common.version = version; iterator->common.version = version;
iterator->common.options = options; iterator->common.options = options;
iterator->common.now = now; iterator->common.now = now;
@ -1157,8 +1159,6 @@ static dns_dbmethods_t sdlzdb_methods = {
.closeversion = closeversion, .closeversion = closeversion,
.findnode = findnode, .findnode = findnode,
.find = find, .find = find,
.attachnode = attachnode,
.detachnode = detachnode,
.createiterator = createiterator, .createiterator = createiterator,
.findrdataset = findrdataset, .findrdataset = findrdataset,
.allrdatasets = allrdatasets, .allrdatasets = allrdatasets,
@ -1265,8 +1265,8 @@ dbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep,
dns_name_t *name DNS__DB_FLARG) { dns_name_t *name DNS__DB_FLARG) {
sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)iterator; sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)iterator;
attachnode(iterator->db, (dns_dbnode_t *)sdlziter->current, sdlznode_attachnode((dns_dbnode_t *)sdlziter->current,
nodep DNS__DB_FLARG_PASS); nodep DNS__DB_FLARG_PASS);
if (name != NULL) { if (name != NULL) {
dns_name_copy(&sdlziter->current->name, name); dns_name_copy(&sdlziter->current->name, name);
return ISC_R_SUCCESS; return ISC_R_SUCCESS;
@ -1295,21 +1295,16 @@ dbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) {
static void static void
disassociate(dns_rdataset_t *rdataset DNS__DB_FLARG) { disassociate(dns_rdataset_t *rdataset DNS__DB_FLARG) {
dns_dbnode_t *node = rdataset->rdlist.node; dns_dbnode_t *node = rdataset->rdlist.node;
dns_sdlznode_t *sdlznode = (dns_sdlznode_t *)node; sdlznode_detachnode(&node DNS__DB_FLARG_PASS);
dns_db_t *db = (dns_db_t *)sdlznode->sdlz;
detachnode(db, &node DNS__DB_FLARG_PASS);
dns_rdatalist_disassociate(rdataset DNS__DB_FLARG_PASS); dns_rdatalist_disassociate(rdataset DNS__DB_FLARG_PASS);
} }
static void static void
rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target DNS__DB_FLARG) { rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target DNS__DB_FLARG) {
dns_dbnode_t *node = source->rdlist.node; dns_dbnode_t *node = source->rdlist.node;
dns_sdlznode_t *sdlznode = (dns_sdlznode_t *)node;
dns_db_t *db = (dns_db_t *)sdlznode->sdlz;
dns_rdatalist_clone(source, target DNS__DB_FLARG_PASS); dns_rdatalist_clone(source, target DNS__DB_FLARG_PASS);
attachnode(db, node, &target->rdlist.node DNS__DB_FLARG_PASS); sdlznode_attachnode(node, &target->rdlist.node DNS__DB_FLARG_PASS);
} }
static dns_rdatasetmethods_t rdataset_methods = { static dns_rdatasetmethods_t rdataset_methods = {
@ -1324,8 +1319,8 @@ static dns_rdatasetmethods_t rdataset_methods = {
}; };
static void static void
list_tordataset(dns_rdatalist_t *rdatalist, dns_db_t *db, dns_dbnode_t *node, list_tordataset(dns_rdatalist_t *rdatalist, dns_db_t *db ISC_ATTR_UNUSED,
dns_rdataset_t *rdataset) { dns_dbnode_t *node, dns_rdataset_t *rdataset) {
/* /*
* The sdlz rdataset is an rdatalist, but additionally holds * The sdlz rdataset is an rdatalist, but additionally holds
* a database node reference. * a database node reference.
@ -1333,7 +1328,7 @@ list_tordataset(dns_rdatalist_t *rdatalist, dns_db_t *db, dns_dbnode_t *node,
dns_rdatalist_tordataset(rdatalist, rdataset); dns_rdatalist_tordataset(rdatalist, rdataset);
rdataset->methods = &rdataset_methods; rdataset->methods = &rdataset_methods;
dns_db_attachnode(db, node, &rdataset->rdlist.node); dns_db_attachnode(node, &rdataset->rdlist.node);
} }
/* /*

View File

@ -372,7 +372,7 @@ foreach_rrset(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
dns_rdatasetiter_destroy(&iter); dns_rdatasetiter_destroy(&iter);
cleanup_node: cleanup_node:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -457,7 +457,7 @@ foreach_rr(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
cleanup_rdataset: cleanup_rdataset:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
cleanup_node: cleanup_node:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -728,7 +728,7 @@ namelist_append_subdomain(dns_db_t *db, dns_name_t *name,
{ {
dns_dbnode_t *node = NULL; dns_dbnode_t *node = NULL;
CHECK(dns_dbiterator_current(dbit, &node, child)); CHECK(dns_dbiterator_current(dbit, &node, child));
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (!dns_name_issubdomain(child, name)) { if (!dns_name_issubdomain(child, name)) {
break; break;
} }
@ -905,7 +905,7 @@ next_active(dns_update_log_t *log, dns_zone_t *zone, dns_db_t *db,
} }
} }
CHECK(dns_dbiterator_current(dbit, &node, newname)); CHECK(dns_dbiterator_current(dbit, &node, newname));
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
/* /*
* The iterator may hold the tree lock, and * The iterator may hold the tree lock, and
@ -974,7 +974,7 @@ add_nsec(dns_update_log_t *log, dns_zone_t *zone, dns_db_t *db,
CHECK(dns_db_findnode(db, name, false, &node)); CHECK(dns_db_findnode(db, name, false, &node));
dns_rdata_init(&rdata); dns_rdata_init(&rdata);
CHECK(dns_nsec_buildrdata(db, ver, node, target, buffer, &rdata)); CHECK(dns_nsec_buildrdata(db, ver, node, target, buffer, &rdata));
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
/* /*
* Delete the old NSEC and record the change. * Delete the old NSEC and record the change.
@ -991,7 +991,7 @@ add_nsec(dns_update_log_t *log, dns_zone_t *zone, dns_db_t *db,
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -1110,7 +1110,7 @@ add_sigs(dns_update_log_t *log, dns_zone_t *zone, dns_db_t *db,
} }
CHECK(dns_db_findrdataset(db, node, ver, type, 0, (isc_stdtime_t)0, CHECK(dns_db_findrdataset(db, node, ver, type, 0, (isc_stdtime_t)0,
&rdataset, NULL)); &rdataset, NULL));
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
#define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0) #define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0)
#define KSK(x) ((dst_key_flags(x) & DNS_KEYFLAG_KSK) != 0) #define KSK(x) ((dst_key_flags(x) & DNS_KEYFLAG_KSK) != 0)
@ -1258,7 +1258,7 @@ failure:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -1289,7 +1289,7 @@ del_keysigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_rrsig, result = dns_db_findrdataset(db, node, ver, dns_rdatatype_rrsig,
dns_rdatatype_dnskey, (isc_stdtime_t)0, dns_rdatatype_dnskey, (isc_stdtime_t)0,
&rdataset, NULL); &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_NOTFOUND) { if (result == ISC_R_NOTFOUND) {
return ISC_R_SUCCESS; return ISC_R_SUCCESS;
@ -1339,7 +1339,7 @@ del_keysigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -1405,7 +1405,7 @@ add_exposed_sigs(dns_update_log_t *log, dns_zone_t *zone, dns_db_t *db,
dns_rdatasetiter_destroy(&iter); dns_rdatasetiter_destroy(&iter);
cleanup_node: cleanup_node:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -1556,7 +1556,7 @@ dns_update_signaturesinc(dns_update_log_t *log, dns_zone_t *zone, dns_db_t *db,
CHECK(dns_rdata_tostruct(&rdata, &soa, NULL)); CHECK(dns_rdata_tostruct(&rdata, &soa, NULL));
state->nsecttl = ISC_MIN(rdataset.ttl, soa.minimum); state->nsecttl = ISC_MIN(rdataset.ttl, soa.minimum);
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
/* /*
* Find all RRsets directly affected by the update, and * Find all RRsets directly affected by the update, and
@ -2125,7 +2125,7 @@ next_state:
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_diff_clear(&state->sig_diff); dns_diff_clear(&state->sig_diff);

View File

@ -408,7 +408,7 @@ fetch_callback_dnskey(void *arg) {
/* Free resources which are not of interest. */ /* Free resources which are not of interest. */
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_detach(&resp->db); dns_db_detach(&resp->db);
@ -504,7 +504,7 @@ fetch_callback_ds(void *arg) {
/* Free resources which are not of interest. */ /* Free resources which are not of interest. */
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_detach(&resp->db); dns_db_detach(&resp->db);

View File

@ -844,7 +844,7 @@ db_find:
dns_rdataset_disassociate(sigrdataset); dns_rdataset_disassociate(sigrdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (!is_cache) { if (!is_cache) {
dns_db_detach(&db); dns_db_detach(&db);
@ -878,7 +878,7 @@ db_find:
dns_db_detach(&db); dns_db_detach(&db);
} }
dns_db_attach(zdb, &db); dns_db_attach(zdb, &db);
dns_db_attachnode(db, znode, &node); dns_db_attachnode(znode, &node);
goto cleanup; goto cleanup;
} }
} }
@ -906,7 +906,7 @@ db_find:
} }
if (db != NULL) { if (db != NULL) {
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_db_detach(&db); dns_db_detach(&db);
} }
@ -937,7 +937,7 @@ db_find:
* Cleanup if non-standard hints are used. * Cleanup if non-standard hints are used.
*/ */
if (db == NULL && node != NULL) { if (db == NULL && node != NULL) {
dns_db_detachnode(view->hints, &node); dns_db_detachnode(&node);
} }
} }
@ -951,7 +951,7 @@ cleanup:
if (zdb != NULL) { if (zdb != NULL) {
if (znode != NULL) { if (znode != NULL) {
dns_db_detachnode(zdb, &znode); dns_db_detachnode(&znode);
} }
dns_db_detach(&zdb); dns_db_detach(&zdb);
} }
@ -961,7 +961,7 @@ cleanup:
if (nodep != NULL) { if (nodep != NULL) {
*nodep = node; *nodep = node;
} else { } else {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
} }
if (dbp != NULL) { if (dbp != NULL) {

View File

@ -3314,11 +3314,11 @@ zone_check_dup(dns_zone_t *zone, dns_db_t *db) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
dns_rdatasetiter_destroy(&rdsit); dns_rdatasetiter_destroy(&rdsit);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_dbiterator_destroy(&dbiterator); dns_dbiterator_destroy(&dbiterator);
@ -3723,7 +3723,7 @@ integrity_checks(dns_zone_t *zone, dns_db_t *db) {
} }
next: next:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (has_a) { if (has_a) {
@ -3792,7 +3792,7 @@ integrity_checks(dns_zone_t *zone, dns_db_t *db) {
cleanup: cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_dbiterator_destroy(&dbiterator); dns_dbiterator_destroy(&dbiterator);
@ -3902,7 +3902,7 @@ zone_check_dnskeys(dns_zone_t *zone, dns_db_t *db) {
cleanup: cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (version != NULL) { if (version != NULL) {
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);
@ -3974,7 +3974,7 @@ resume_signingwithkey(dns_zone_t *zone) {
cleanup: cleanup:
if (db != NULL) { if (db != NULL) {
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (version != NULL) { if (version != NULL) {
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);
@ -4261,7 +4261,7 @@ resume_addnsec3chain(dns_zone_t *zone) {
cleanup: cleanup:
if (db != NULL) { if (db != NULL) {
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (version != NULL) { if (version != NULL) {
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);
@ -4419,7 +4419,7 @@ cleanup:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -5188,7 +5188,7 @@ check_reportchannel(dns_zone_t *zone, dns_db_t *db) {
result = dns_db_findrdataset(db, node, version, dns_rdatatype_txt, result = dns_db_findrdataset(db, node, version, dns_rdatatype_txt,
dns_rdatatype_none, 0, &rdataset, NULL); dns_rdatatype_none, 0, &rdataset, NULL);
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_SUCCESS) { if (result == ISC_R_SUCCESS) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
@ -6060,7 +6060,7 @@ zone_get_from_db(dns_zone_t *zone, dns_db_t *db, unsigned int *nscount,
} }
} }
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
closeversion: closeversion:
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);
@ -6814,7 +6814,7 @@ dns_zone_findkeys(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -6897,7 +6897,7 @@ failure:
dns_rdataset_disassociate(&keyset); dns_rdataset_disassociate(&keyset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
ISC_LIST_FOREACH (dnskeys, key, link) { ISC_LIST_FOREACH (dnskeys, key, link) {
ISC_LIST_UNLINK(dnskeys, key, link); ISC_LIST_UNLINK(dnskeys, key, link);
@ -7091,7 +7091,7 @@ del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
} }
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_rrsig, type, result = dns_db_findrdataset(db, node, ver, dns_rdatatype_rrsig, type,
(isc_stdtime_t)0, &rdataset, NULL); (isc_stdtime_t)0, &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_NOTFOUND) { if (result == ISC_R_NOTFOUND) {
INSIST(!dns_rdataset_isassociated(&rdataset)); INSIST(!dns_rdataset_isassociated(&rdataset));
@ -7249,7 +7249,7 @@ del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
} }
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -7291,7 +7291,7 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, dns_zone_t *zone,
} }
result = dns_db_findrdataset(db, node, ver, type, 0, (isc_stdtime_t)0, result = dns_db_findrdataset(db, node, ver, type, 0, (isc_stdtime_t)0,
&rdataset, NULL); &rdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result == ISC_R_NOTFOUND) { if (result == ISC_R_NOTFOUND) {
INSIST(!dns_rdataset_isassociated(&rdataset)); INSIST(!dns_rdataset_isassociated(&rdataset));
return ISC_R_SUCCESS; return ISC_R_SUCCESS;
@ -7456,7 +7456,7 @@ failure:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -7741,7 +7741,7 @@ next_active(dns_db_t *db, dns_dbversion_t *version, dns_name_t *oldname,
if (bottom && dns_name_issubdomain(newname, oldname) && if (bottom && dns_name_issubdomain(newname, oldname) &&
!dns_name_equal(newname, oldname)) !dns_name_equal(newname, oldname))
{ {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
continue; continue;
} }
/* /*
@ -7749,7 +7749,7 @@ next_active(dns_db_t *db, dns_dbversion_t *version, dns_name_t *oldname,
*/ */
CHECK(dns_db_allrdatasets(db, node, version, 0, 0, &rdsit)); CHECK(dns_db_allrdatasets(db, node, version, 0, 0, &rdsit));
result = dns_rdatasetiter_first(rdsit); result = dns_rdatasetiter_first(rdsit);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_rdatasetiter_destroy(&rdsit); dns_rdatasetiter_destroy(&rdsit);
if (result != ISC_R_NOMORE) { if (result != ISC_R_NOMORE) {
break; break;
@ -7757,7 +7757,7 @@ next_active(dns_db_t *db, dns_dbversion_t *version, dns_name_t *oldname,
} while (1); } while (1);
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (dbit != NULL) { if (dbit != NULL) {
dns_dbiterator_destroy(&dbit); dns_dbiterator_destroy(&dbit);
@ -8097,7 +8097,7 @@ success:
result = ISC_R_SUCCESS; result = ISC_R_SUCCESS;
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -8225,7 +8225,7 @@ failure:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(signing->db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -8427,7 +8427,7 @@ add:
CHECK(update_one_rr(db, ver, diff, DNS_DIFFOP_ADD, name, ttl, &rdata)); CHECK(update_one_rr(db, ver, diff, DNS_DIFFOP_ADD, name, ttl, &rdata));
failure: failure:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (dns_rdataset_isassociated(&rdataset)) { if (dns_rdataset_isassociated(&rdataset)) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
@ -8522,11 +8522,11 @@ need_nsec_chain(dns_db_t *db, dns_dbversion_t *ver,
&rdataset, NULL); &rdataset, NULL);
if (result == ISC_R_SUCCESS) { if (result == ISC_R_SUCCESS) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
if (result != ISC_R_NOTFOUND) { if (result != ISC_R_NOTFOUND) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -8534,11 +8534,11 @@ need_nsec_chain(dns_db_t *db, dns_dbversion_t *ver,
0, &rdataset, NULL); 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) { if (result == ISC_R_NOTFOUND) {
*answer = true; *answer = true;
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return ISC_R_SUCCESS; return ISC_R_SUCCESS;
} }
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -8578,7 +8578,7 @@ failure:
if (dns_rdataset_isassociated(&rdataset)) { if (dns_rdataset_isassociated(&rdataset)) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -8941,7 +8941,7 @@ zone_nsec3chain(dns_zone_t *zone) {
*/ */
next_addnode: next_addnode:
first = false; first = false;
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
do { do {
result = dns_dbiterator_next(nsec3chain->dbiterator); result = dns_dbiterator_next(nsec3chain->dbiterator);
@ -8984,7 +8984,7 @@ zone_nsec3chain(dns_zone_t *zone) {
} else if (delegation) { } else if (delegation) {
dns_dbiterator_current(nsec3chain->dbiterator, dns_dbiterator_current(nsec3chain->dbiterator,
&node, nextname); &node, nextname);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (!dns_name_issubdomain(nextname, name)) { if (!dns_name_issubdomain(nextname, name)) {
break; break;
} }
@ -9184,7 +9184,7 @@ zone_nsec3chain(dns_zone_t *zone) {
next_removenode: next_removenode:
first = false; first = false;
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
do { do {
result = dns_dbiterator_next(nsec3chain->dbiterator); result = dns_dbiterator_next(nsec3chain->dbiterator);
if (result == ISC_R_NOMORE && buildnsecchain) { if (result == ISC_R_NOMORE && buildnsecchain) {
@ -9222,7 +9222,7 @@ zone_nsec3chain(dns_zone_t *zone) {
} else if (delegation) { } else if (delegation) {
dns_dbiterator_current(nsec3chain->dbiterator, dns_dbiterator_current(nsec3chain->dbiterator,
&node, nextname); &node, nextname);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (!dns_name_issubdomain(nextname, name)) { if (!dns_name_issubdomain(nextname, name)) {
break; break;
} }
@ -9271,7 +9271,7 @@ skip_removals:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
dns_rdatasetiter_destroy(&iterator); dns_rdatasetiter_destroy(&iterator);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (rebuild_nsec) { if (rebuild_nsec) {
if (nsec3chain != NULL) { if (nsec3chain != NULL) {
@ -9498,7 +9498,7 @@ failure:
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (version != NULL) { if (version != NULL) {
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);
@ -10051,7 +10051,7 @@ zone_sign(dns_zone_t *zone) {
*/ */
next_node: next_node:
first = false; first = false;
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
do { do {
result = dns_dbiterator_next(signing->dbiterator); result = dns_dbiterator_next(signing->dbiterator);
if (result == ISC_R_NOMORE) { if (result == ISC_R_NOMORE) {
@ -10099,7 +10099,7 @@ zone_sign(dns_zone_t *zone) {
} else if (is_bottom_of_zone) { } else if (is_bottom_of_zone) {
dns_dbiterator_current(signing->dbiterator, dns_dbiterator_current(signing->dbiterator,
&node, nextname); &node, nextname);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (!dns_name_issubdomain(nextname, name)) { if (!dns_name_issubdomain(nextname, name)) {
break; break;
} }
@ -10242,7 +10242,7 @@ cleanup:
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (version != NULL) { if (version != NULL) {
@ -10588,7 +10588,7 @@ keyfetch_done(void *arg) {
/* Free resources which are not of interest */ /* Free resources which are not of interest */
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_detach(&resp->db); dns_db_detach(&resp->db);
@ -13325,7 +13325,7 @@ cleanup3:
dns_name_free(&primary, zone->mctx); dns_name_free(&primary, zone->mctx);
} }
cleanup2: cleanup2:
dns_db_detachnode(zonedb, &node); dns_db_detachnode(&node);
cleanup1: cleanup1:
dns_db_closeversion(zonedb, &version, false); dns_db_closeversion(zonedb, &version, false);
dns_db_detach(&zonedb); dns_db_detach(&zonedb);
@ -13621,7 +13621,7 @@ stub_glue_response(void *arg) {
"dns_db_addrdataset() failed: %s", "dns_db_addrdataset() failed: %s",
isc_result_totext(result)); isc_result_totext(result));
} }
dns_db_detachnode(stub->db, &node); dns_db_detachnode(&node);
cleanup: cleanup:
if (msg != NULL) { if (msg != NULL) {
@ -13754,7 +13754,7 @@ save_nsrrset(dns_message_t *message, dns_name_t *name,
goto done; goto done;
} }
result = dns_db_addrdataset(db, node, version, 0, nsrdataset, 0, NULL); result = dns_db_addrdataset(db, node, version, 0, nsrdataset, 0, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
goto done; goto done;
} }
@ -13783,7 +13783,7 @@ save_nsrrset(dns_message_t *message, dns_name_t *name,
} }
result = dns_db_addrdataset(db, node, version, 0, result = dns_db_addrdataset(db, node, version, 0,
rdataset, 0, NULL); rdataset, 0, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
goto done; goto done;
} }
@ -13801,7 +13801,7 @@ save_nsrrset(dns_message_t *message, dns_name_t *name,
} }
result = dns_db_addrdataset(db, node, version, 0, result = dns_db_addrdataset(db, node, version, 0,
rdataset, 0, NULL); rdataset, 0, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
goto done; goto done;
} }
@ -15017,7 +15017,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) {
result = dns_db_addrdataset(stub->db, node, stub->version, 0, result = dns_db_addrdataset(stub->db, node, stub->version, 0,
soardataset, 0, NULL); soardataset, 0, NULL);
dns_db_detachnode(stub->db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_INFO, dns_zone_log(zone, ISC_LOG_INFO,
"refreshing stub: " "refreshing stub: "
@ -15643,7 +15643,7 @@ notify_createmessage(dns_zone_t *zone, unsigned int flags,
soa_cleanup: soa_cleanup:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(zonedb, &node); dns_db_detachnode(&node);
} }
if (version != NULL) { if (version != NULL) {
dns_db_closeversion(zonedb, &version, false); dns_db_closeversion(zonedb, &version, false);
@ -16970,7 +16970,7 @@ sync_secure_db(dns_zone_t *seczone, dns_zone_t *raw, dns_db_t *secdb,
if (dns_rdataset_isassociated(&rdataset)) { if (dns_rdataset_isassociated(&rdataset)) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
dns_db_detachnode(secdb, &node); dns_db_detachnode(&node);
} }
ISC_LIST_FOREACH (diff->tuples, tuple, link) { ISC_LIST_FOREACH (diff->tuples, tuple, link) {
@ -17559,7 +17559,7 @@ done:
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (version != NULL) { if (version != NULL) {
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);
@ -17675,10 +17675,10 @@ cleanup:
dns_rdatasetiter_destroy(&rdsit); dns_rdatasetiter_destroy(&rdsit);
} }
if (rawnode) { if (rawnode) {
dns_db_detachnode(rawdb, &rawnode); dns_db_detachnode(&rawnode);
} }
if (node) { if (node) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -20511,7 +20511,7 @@ rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -20799,7 +20799,7 @@ clean_nsec3param(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -21758,7 +21758,7 @@ nsfetch_done(void *arg) {
/* Free resources which are not of interest */ /* Free resources which are not of interest */
if (resp->node != NULL) { if (resp->node != NULL) {
dns_db_detachnode(resp->db, &resp->node); dns_db_detachnode(&resp->node);
} }
if (resp->db != NULL) { if (resp->db != NULL) {
dns_db_detach(&resp->db); dns_db_detach(&resp->db);
@ -22964,7 +22964,7 @@ failure:
dns_rdataset_disassociate(&cdnskeyset); dns_rdataset_disassociate(&cdnskeyset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (db != NULL) { if (db != NULL) {
dns_db_detach(&db); dns_db_detach(&db);
@ -23006,7 +23006,7 @@ dns_zone_nscheck(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
return result; return result;
} }
result = zone_count_ns_rr(zone, db, node, version, NULL, errors, false); result = zone_count_ns_rr(zone, db, node, version, NULL, errors, false);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -23255,7 +23255,7 @@ failure:
if (dns_rdataset_isassociated(&cdnskey)) { if (dns_rdataset_isassociated(&cdnskey)) {
dns_rdataset_disassociate(&cdnskey); dns_rdataset_disassociate(&cdnskey);
} }
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -23609,7 +23609,7 @@ failure:
} }
if (db != NULL) { if (db != NULL) {
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (oldver != NULL) { if (oldver != NULL) {
dns_db_closeversion(db, &oldver, false); dns_db_closeversion(db, &oldver, false);
@ -23963,7 +23963,7 @@ failure:
dns_rdataset_disassociate(&nrdataset); dns_rdataset_disassociate(&nrdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (oldver != NULL) { if (oldver != NULL) {
dns_db_closeversion(db, &oldver, false); dns_db_closeversion(db, &oldver, false);
@ -24129,7 +24129,7 @@ failure:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (version != NULL) { if (version != NULL) {
dns_db_closeversion(db, &version, false); dns_db_closeversion(db, &version, false);

View File

@ -665,7 +665,7 @@ done:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
} }
return result; return result;
@ -763,7 +763,7 @@ done:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
} }
return result; return result;
@ -1408,7 +1408,7 @@ check_apex_rrsets(vctx_t *vctx) {
result = ISC_R_SUCCESS; result = ISC_R_SUCCESS;
done: done:
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -1734,10 +1734,10 @@ verify_nodes(vctx_t *vctx, isc_result_t *vresult) {
if (!dns_name_issubdomain(name, vctx->origin)) { if (!dns_name_issubdomain(name, vctx->origin)) {
result = check_no_nsec(vctx, name, node); result = check_no_nsec(vctx, name, node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
goto done; goto done;
} }
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
if (result == ISC_R_NOMORE) { if (result == ISC_R_NOMORE) {
done = true; done = true;
@ -1770,7 +1770,7 @@ verify_nodes(vctx_t *vctx, isc_result_t *vresult) {
"dns_dbiterator_current():" "dns_dbiterator_current():"
" %s", " %s",
isc_result_totext(result)); isc_result_totext(result));
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
goto done; goto done;
} }
if (!dns_name_issubdomain(nextname, vctx->origin) || if (!dns_name_issubdomain(nextname, vctx->origin) ||
@ -1780,16 +1780,16 @@ verify_nodes(vctx_t *vctx, isc_result_t *vresult) {
result = check_no_nsec(vctx, nextname, result = check_no_nsec(vctx, nextname,
nextnode); nextnode);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
dns_db_detachnode(vctx->db, &nextnode); dns_db_detachnode(&nextnode);
goto done; goto done;
} }
dns_db_detachnode(vctx->db, &nextnode); dns_db_detachnode(&nextnode);
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
} }
result = is_empty(vctx, nextnode); result = is_empty(vctx, nextnode);
dns_db_detachnode(vctx->db, &nextnode); dns_db_detachnode(&nextnode);
switch (result) { switch (result) {
case ISC_R_SUCCESS: case ISC_R_SUCCESS:
break; break;
@ -1797,7 +1797,7 @@ verify_nodes(vctx_t *vctx, isc_result_t *vresult) {
result = dns_dbiterator_next(dbiter); result = dns_dbiterator_next(dbiter);
continue; continue;
default: default:
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
} }
break; break;
} }
@ -1809,14 +1809,14 @@ verify_nodes(vctx_t *vctx, isc_result_t *vresult) {
"iterating through the database " "iterating through the database "
"failed: %s", "failed: %s",
isc_result_totext(result)); isc_result_totext(result));
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
goto done; goto done;
} }
result = verifynode(vctx, name, node, isdelegation, dstkeys, result = verifynode(vctx, name, node, isdelegation, dstkeys,
nkeys, &vctx->nsecset, &vctx->nsec3paramset, nkeys, &vctx->nsecset, &vctx->nsec3paramset,
nextname, &tvresult); nextname, &tvresult);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
goto done; goto done;
} }
if (*vresult == ISC_R_UNSET) { if (*vresult == ISC_R_UNSET) {
@ -1830,7 +1830,7 @@ verify_nodes(vctx_t *vctx, isc_result_t *vresult) {
vctx, name, prevname, isdelegation, vctx, name, prevname, isdelegation,
&vctx->nsec3paramset, &tvresult); &vctx->nsec3paramset, &tvresult);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
goto done; goto done;
} }
} else { } else {
@ -1840,7 +1840,7 @@ verify_nodes(vctx_t *vctx, isc_result_t *vresult) {
if (*vresult == ISC_R_SUCCESS) { if (*vresult == ISC_R_SUCCESS) {
*vresult = tvresult; *vresult = tvresult;
} }
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
} }
dns_dbiterator_destroy(&dbiter); dns_dbiterator_destroy(&dbiter);
@ -1865,11 +1865,11 @@ verify_nodes(vctx_t *vctx, isc_result_t *vresult) {
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
zoneverify_log_error(vctx, "verifynode: %s", zoneverify_log_error(vctx, "verifynode: %s",
isc_result_totext(result)); isc_result_totext(result));
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
goto done; goto done;
} }
result = record_found(vctx, name, node, &vctx->nsec3paramset); result = record_found(vctx, name, node, &vctx->nsec3paramset);
dns_db_detachnode(vctx->db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
goto done; goto done;
} }

View File

@ -806,8 +806,7 @@ query_reset(ns_client_t *client, bool everything) {
ns_client_putrdataset(client, &client->query.redirect.sigrdataset); ns_client_putrdataset(client, &client->query.redirect.sigrdataset);
if (client->query.redirect.db != NULL) { if (client->query.redirect.db != NULL) {
if (client->query.redirect.node != NULL) { if (client->query.redirect.node != NULL) {
dns_db_detachnode(client->query.redirect.db, dns_db_detachnode(&client->query.redirect.node);
&client->query.redirect.node);
} }
dns_db_detach(&client->query.redirect.db); dns_db_detach(&client->query.redirect.db);
} }
@ -1614,7 +1613,7 @@ query_additionalauthfind(dns_db_t *db, dns_dbversion_t *version,
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
@ -1845,7 +1844,7 @@ query_additional_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype,
dns_rdataset_disassociate(sigrdataset); dns_rdataset_disassociate(sigrdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_db_detach(&db); dns_db_detach(&db);
@ -2142,7 +2141,7 @@ cleanup:
ns_client_releasename(client, &fname); ns_client_releasename(client, &fname);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (db != NULL) { if (db != NULL) {
dns_db_detach(&db); dns_db_detach(&db);
@ -2350,7 +2349,7 @@ mark_secure(ns_client_t *client, dns_db_t *db, dns_name_t *name,
NULL); NULL);
(void)dns_db_addrdataset(db, node, NULL, client->inner.now, sigrdataset, (void)dns_db_addrdataset(db, node, NULL, client->inner.now, sigrdataset,
0, NULL); 0, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
/* /*
@ -2382,7 +2381,7 @@ get_key(ns_client_t *client, dns_db_t *db, dns_rdata_rrsig_t *rrsig,
result = dns_db_findrdataset( result = dns_db_findrdataset(
db, node, NULL, dns_rdatatype_dnskey, 0, db, node, NULL, dns_rdatatype_dnskey, 0,
client->inner.now, keyrdataset, NULL); client->inner.now, keyrdataset, NULL);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
return false; return false;
} }
@ -2545,7 +2544,7 @@ free_fresp(ns_client_t *client, dns_fetchresponse_t **frespp) {
dns_resolver_destroyfetch(&fresp->fetch); dns_resolver_destroyfetch(&fresp->fetch);
} }
if (fresp->node != NULL) { if (fresp->node != NULL) {
dns_db_detachnode(fresp->db, &fresp->node); dns_db_detachnode(&fresp->node);
} }
if (fresp->db != NULL) { if (fresp->db != NULL) {
dns_db_detach(&fresp->db); dns_db_detach(&fresp->db);
@ -2685,7 +2684,7 @@ stale_refresh_aftermath(ns_client_t *client, isc_result_t result) {
qctx.fname, &cm, &ci, qctx.rdataset, qctx.fname, &cm, &ci, qctx.rdataset,
qctx.sigrdataset); qctx.sigrdataset);
if (qctx.node != NULL) { if (qctx.node != NULL) {
dns_db_detachnode(db, &qctx.node); dns_db_detachnode(&qctx.node);
} }
dns_db_detach(&db); dns_db_detach(&db);
@ -2890,7 +2889,7 @@ rpz_clean(dns_zone_t **zonep, dns_db_t **dbp, dns_dbnode_t **nodep,
dns_rdataset_t **rdatasetp) { dns_rdataset_t **rdatasetp) {
if (nodep != NULL && *nodep != NULL) { if (nodep != NULL && *nodep != NULL) {
REQUIRE(dbp != NULL && *dbp != NULL); REQUIRE(dbp != NULL && *dbp != NULL);
dns_db_detachnode(*dbp, nodep); dns_db_detachnode(nodep);
} }
if (dbp != NULL && *dbp != NULL) { if (dbp != NULL && *dbp != NULL) {
dns_db_detach(dbp); dns_db_detach(dbp);
@ -3326,7 +3325,7 @@ rpz_find_p(ns_client_t *client, dns_name_t *self_name, dns_rdatatype_t qtype,
if (dns_rdataset_isassociated(*rdatasetp)) { if (dns_rdataset_isassociated(*rdatasetp)) {
dns_rdataset_disassociate(*rdatasetp); dns_rdataset_disassociate(*rdatasetp);
} }
dns_db_detachnode(*dbp, nodep); dns_db_detachnode(nodep);
if (dns_rdatatype_issig(qtype)) { if (dns_rdatatype_issig(qtype)) {
result = DNS_R_NXRRSET; result = DNS_R_NXRRSET;
@ -4627,7 +4626,7 @@ cleanup:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return ttl; return ttl;
} }
@ -4790,7 +4789,7 @@ redirect(ns_client_t *client, dns_name_t *name, dns_rdataset_t *rdataset,
dns_rdataset_disassociate(&trdataset); dns_rdataset_disassociate(&trdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_db_detach(&db); dns_db_detach(&db);
return ISC_R_NOTFOUND; return ISC_R_NOTFOUND;
@ -4807,12 +4806,12 @@ redirect(ns_client_t *client, dns_name_t *name, dns_rdataset_t *rdataset,
} }
nxrrset: nxrrset:
if (*nodep != NULL) { if (*nodep != NULL) {
dns_db_detachnode(*dbp, nodep); dns_db_detachnode(nodep);
} }
dns_db_detach(dbp); dns_db_detach(dbp);
dns_db_attachnode(db, node, nodep); dns_db_attachnode(node, nodep);
dns_db_attach(db, dbp); dns_db_attach(db, dbp);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_db_detach(&db); dns_db_detach(&db);
*versionp = dbversion->version; *versionp = dbversion->version;
@ -4937,7 +4936,7 @@ redirect2(ns_client_t *client, dns_name_t *name, dns_rdataset_t *rdataset,
dns_rdataset_disassociate(&trdataset); dns_rdataset_disassociate(&trdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_db_detach(&db); dns_db_detach(&db);
/* /*
@ -4960,7 +4959,7 @@ redirect2(ns_client_t *client, dns_name_t *name, dns_rdataset_t *rdataset,
dns_rdataset_disassociate(&trdataset); dns_rdataset_disassociate(&trdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_db_detach(&db); dns_db_detach(&db);
return ISC_R_NOTFOUND; return ISC_R_NOTFOUND;
@ -4989,12 +4988,12 @@ redirect2(ns_client_t *client, dns_name_t *name, dns_rdataset_t *rdataset,
} }
nxrrset: nxrrset:
if (*nodep != NULL) { if (*nodep != NULL) {
dns_db_detachnode(*dbp, nodep); dns_db_detachnode(nodep);
} }
dns_db_detach(dbp); dns_db_detach(dbp);
dns_db_attachnode(db, node, nodep); dns_db_attachnode(node, nodep);
dns_db_attach(db, dbp); dns_db_attach(db, dbp);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_db_detach(&db); dns_db_detach(&db);
*is_zonep = is_zone; *is_zonep = is_zone;
*versionp = version; *versionp = version;
@ -5063,7 +5062,7 @@ qctx_clean(query_ctx_t *qctx) {
dns_rdataset_disassociate(qctx->sigrdataset); dns_rdataset_disassociate(qctx->sigrdataset);
} }
if (qctx->db != NULL && qctx->node != NULL) { if (qctx->db != NULL && qctx->node != NULL) {
dns_db_detachnode(qctx->db, &qctx->node); dns_db_detachnode(&qctx->node);
} }
if (qctx->client != NULL && qctx->client->query.gluedb != NULL) { if (qctx->client != NULL && qctx->client->query.gluedb != NULL) {
dns_db_detach(&qctx->client->query.gluedb); dns_db_detach(&qctx->client->query.gluedb);
@ -5100,7 +5099,7 @@ qctx_freedata(query_ctx_t *qctx) {
ns_client_putrdataset(qctx->client, &qctx->zsigrdataset); ns_client_putrdataset(qctx->client, &qctx->zsigrdataset);
ns_client_putrdataset(qctx->client, &qctx->zrdataset); ns_client_putrdataset(qctx->client, &qctx->zrdataset);
ns_client_releasename(qctx->client, &qctx->zfname); ns_client_releasename(qctx->client, &qctx->zfname);
dns_db_detachnode(qctx->zdb, &qctx->znode); dns_db_detachnode(&qctx->znode);
dns_db_detach(&qctx->zdb); dns_db_detach(&qctx->zdb);
qctx->zversion = NULL; qctx->zversion = NULL;
} }
@ -6373,7 +6372,7 @@ query_resume(query_ctx_t *qctx) {
qctx->qtype = qctx->rpz_st->q.qtype; qctx->qtype = qctx->rpz_st->q.qtype;
if (qctx->fresp->node != NULL) { if (qctx->fresp->node != NULL) {
dns_db_detachnode(qctx->fresp->db, &qctx->fresp->node); dns_db_detachnode(&qctx->fresp->node);
} }
SAVE(qctx->rpz_st->r.db, qctx->fresp->db); SAVE(qctx->rpz_st->r.db, qctx->fresp->db);
qctx->rpz_st->r.r_type = qctx->fresp->qtype; qctx->rpz_st->r.r_type = qctx->fresp->qtype;
@ -6411,7 +6410,7 @@ query_resume(query_ctx_t *qctx) {
ns_client_putrdataset(qctx->client, &qctx->fresp->rdataset); ns_client_putrdataset(qctx->client, &qctx->fresp->rdataset);
ns_client_putrdataset(qctx->client, &qctx->fresp->sigrdataset); ns_client_putrdataset(qctx->client, &qctx->fresp->sigrdataset);
if (qctx->fresp->node != NULL) { if (qctx->fresp->node != NULL) {
dns_db_detachnode(qctx->fresp->db, &qctx->fresp->node); dns_db_detachnode(&qctx->fresp->node);
} }
if (qctx->fresp->db != NULL) { if (qctx->fresp->db != NULL) {
dns_db_detach(&qctx->fresp->db); dns_db_detach(&qctx->fresp->db);
@ -8003,7 +8002,7 @@ query_respond(query_ctx_t *qctx) {
SAVE(qctx->client->query.dns64_aaaa, qctx->rdataset); SAVE(qctx->client->query.dns64_aaaa, qctx->rdataset);
SAVE(qctx->client->query.dns64_sigaaaa, qctx->sigrdataset); SAVE(qctx->client->query.dns64_sigaaaa, qctx->sigrdataset);
ns_client_releasename(qctx->client, &qctx->fname); ns_client_releasename(qctx->client, &qctx->fname);
dns_db_detachnode(qctx->db, &qctx->node); dns_db_detachnode(&qctx->node);
qctx->type = qctx->qtype = dns_rdatatype_a; qctx->type = qctx->qtype = dns_rdatatype_a;
qctx->dns64_exclude = qctx->dns64 = true; qctx->dns64_exclude = qctx->dns64 = true;
@ -8491,7 +8490,7 @@ query_zone_delegation(query_ctx_t *qctx) {
&qctx->fname); &qctx->fname);
} }
if (qctx->node != NULL) { if (qctx->node != NULL) {
dns_db_detachnode(qctx->db, &qctx->node); dns_db_detachnode(&qctx->node);
} }
if (qctx->db != NULL) { if (qctx->db != NULL) {
dns_db_detach(&qctx->db); dns_db_detach(&qctx->db);
@ -8615,7 +8614,7 @@ query_delegation(query_ctx_t *qctx) {
} }
qctx->version = NULL; qctx->version = NULL;
dns_db_detachnode(qctx->db, &qctx->node); dns_db_detachnode(&qctx->node);
dns_db_detach(&qctx->db); dns_db_detach(&qctx->db);
RESTORE(qctx->db, qctx->zdb); RESTORE(qctx->db, qctx->zdb);
RESTORE(qctx->node, qctx->znode); RESTORE(qctx->node, qctx->znode);
@ -8924,7 +8923,7 @@ query_nodata(query_ctx_t *qctx, isc_result_t res) {
SAVE(qctx->client->query.dns64_aaaa, qctx->rdataset); SAVE(qctx->client->query.dns64_aaaa, qctx->rdataset);
SAVE(qctx->client->query.dns64_sigaaaa, qctx->sigrdataset); SAVE(qctx->client->query.dns64_sigaaaa, qctx->sigrdataset);
ns_client_releasename(qctx->client, &qctx->fname); ns_client_releasename(qctx->client, &qctx->fname);
dns_db_detachnode(qctx->db, &qctx->node); dns_db_detachnode(&qctx->node);
qctx->type = qctx->qtype = dns_rdatatype_a; qctx->type = qctx->qtype = dns_rdatatype_a;
qctx->dns64 = true; qctx->dns64 = true;
return query_lookup(qctx); return query_lookup(qctx);
@ -9890,7 +9889,7 @@ query_coveringnsec(query_ctx_t *qctx) {
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
soardataset = ns_client_newrdataset(qctx->client); soardataset = ns_client_newrdataset(qctx->client);
@ -9926,7 +9925,7 @@ cleanup:
} }
if (db != NULL) { if (db != NULL) {
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_db_detach(&db); dns_db_detach(&db);
} }
@ -9944,7 +9943,7 @@ cleanup:
ns_client_releasename(qctx->client, &qctx->fname); ns_client_releasename(qctx->client, &qctx->fname);
} }
if (qctx->node != NULL) { if (qctx->node != NULL) {
dns_db_detachnode(qctx->db, &qctx->node); dns_db_detachnode(&qctx->node);
} }
ns_client_putrdataset(qctx->client, &qctx->rdataset); ns_client_putrdataset(qctx->client, &qctx->rdataset);
if (qctx->sigrdataset != NULL) { if (qctx->sigrdataset != NULL) {
@ -10508,7 +10507,7 @@ query_addsoa(query_ctx_t *qctx, unsigned int override_ttl,
ns_client_releasename(client, &name); ns_client_releasename(client, &name);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(qctx->db, &node); dns_db_detachnode(&node);
} }
return eresult; return eresult;
@ -10592,7 +10591,7 @@ query_addns(query_ctx_t *qctx) {
ns_client_releasename(client, &name); ns_client_releasename(client, &name);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(qctx->db, &node); dns_db_detachnode(&node);
} }
CTRACE(ISC_LOG_DEBUG(3), "query_addns: done"); CTRACE(ISC_LOG_DEBUG(3), "query_addns: done");
@ -10692,7 +10691,7 @@ db_find:
} }
if (USECACHE(client)) { if (USECACHE(client)) {
ns_client_keepname(client, fname, dbuf); ns_client_keepname(client, fname, dbuf);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
SAVE(zdb, db); SAVE(zdb, db);
SAVE(zfname, fname); SAVE(zfname, fname);
SAVE(zrdataset, rdataset); SAVE(zrdataset, rdataset);
@ -10743,7 +10742,7 @@ db_find:
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_db_detach(&db); dns_db_detach(&db);
@ -10805,7 +10804,7 @@ cleanup:
ns_client_releasename(client, &fname); ns_client_releasename(client, &fname);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (db != NULL) { if (db != NULL) {
dns_db_detach(&db); dns_db_detach(&db);
@ -10922,7 +10921,7 @@ again:
dns_rdatatype_nsec, options, 0, &node, fname, dns_rdatatype_nsec, options, 0, &node, fname,
&cm, &ci, rdataset, sigrdataset); &cm, &ci, rdataset, sigrdataset);
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(qctx->db, &node); dns_db_detachnode(&node);
} }
if (!dns_rdataset_isassociated(rdataset)) { if (!dns_rdataset_isassociated(rdataset)) {

View File

@ -622,7 +622,7 @@ foreach_rrset(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
dns_rdatasetiter_destroy(&iter); dns_rdatasetiter_destroy(&iter);
cleanup_node: cleanup_node:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -728,7 +728,7 @@ foreach_rr(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
cleanup_rdataset: cleanup_rdataset:
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
cleanup_node: cleanup_node:
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
@ -1143,7 +1143,7 @@ temp_check(isc_mem_t *mctx, dns_diff_t *temp, dns_db_t *db,
if (dns_rdatatype_issig(type)) { if (dns_rdatatype_issig(type)) {
covers = dns_rdata_covers(&t->rdata); covers = dns_rdata_covers(&t->rdata);
} else if (type == dns_rdatatype_any) { } else if (type == dns_rdatatype_any) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_diff_clear(&trash); dns_diff_clear(&trash);
return DNS_R_NXRRSET; return DNS_R_NXRRSET;
} else { } else {
@ -1159,7 +1159,7 @@ temp_check(isc_mem_t *mctx, dns_diff_t *temp, dns_db_t *db,
covers, (isc_stdtime_t)0, covers, (isc_stdtime_t)0,
&rdataset, NULL); &rdataset, NULL);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_diff_clear(&trash); dns_diff_clear(&trash);
return DNS_R_NXRRSET; return DNS_R_NXRRSET;
} }
@ -1215,11 +1215,11 @@ temp_check(isc_mem_t *mctx, dns_diff_t *temp, dns_db_t *db,
dns_diff_clear(&u_rrs); dns_diff_clear(&u_rrs);
dns_diff_clear(&trash); dns_diff_clear(&trash);
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
return result; return result;
} }
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_diff_clear(&trash); dns_diff_clear(&trash);
@ -2189,7 +2189,7 @@ rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
return result; return result;
} }
@ -2272,7 +2272,7 @@ success:
failure: failure:
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
if (dns_rdataset_isassociated(&rdataset)) { if (dns_rdataset_isassociated(&rdataset)) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);

View File

@ -54,11 +54,11 @@ ISC_LOOP_TEST_IMPL(getoriginnode) {
result = dns_db_getoriginnode(db, &node); result = dns_db_getoriginnode(db, &node);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
result = dns_db_getoriginnode(db, &node); result = dns_db_getoriginnode(db, &node);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_db_detach(&db); dns_db_detach(&db);
isc_loopmgr_shutdown(); isc_loopmgr_shutdown();
@ -165,7 +165,7 @@ ISC_LOOP_TEST_IMPL(dns_dbfind_staleok) {
NULL); NULL);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
result = dns_db_find(db, example, NULL, dns_rdatatype_a, 0, 0, result = dns_db_find(db, example, NULL, dns_rdatatype_a, 0, 0,
@ -181,7 +181,7 @@ ISC_LOOP_TEST_IMPL(dns_dbfind_staleok) {
assert_in_range(count, 1, 21); /* loop sanity */ assert_in_range(count, 1, 21); /* loop sanity */
assert_int_equal(rdataset.attributes.stale, false); assert_int_equal(rdataset.attributes.stale, false);
assert_true(rdataset.ttl > 0); assert_true(rdataset.ttl > 0);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
usleep(100000); /* 100 ms */ usleep(100000); /* 100 ms */
@ -215,7 +215,7 @@ ISC_LOOP_TEST_IMPL(dns_dbfind_staleok) {
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(rdataset.attributes.stale, assert_int_equal(rdataset.attributes.stale,
true); true);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
usleep(100000); /* 100 ms */ usleep(100000); /* 100 ms */
@ -314,7 +314,7 @@ ISC_LOOP_TEST_IMPL(version) {
foundname, &rdataset, NULL); foundname, &rdataset, NULL);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
dns_db_closeversion(db, &ver, false); dns_db_closeversion(db, &ver, false);
/* Open new version for writing */ /* Open new version for writing */
@ -335,7 +335,7 @@ ISC_LOOP_TEST_IMPL(version) {
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
/* This should fail now */ /* This should fail now */
result = dns_db_find(db, name, new, dns_rdatatype_a, 0, 0, &node, result = dns_db_find(db, name, new, dns_rdatatype_a, 0, 0, &node,
@ -348,7 +348,7 @@ ISC_LOOP_TEST_IMPL(version) {
result = dns_db_find(db, name, ver, dns_rdatatype_a, 0, 0, &node, result = dns_db_find(db, name, ver, dns_rdatatype_a, 0, 0, &node,
foundname, &rdataset, NULL); foundname, &rdataset, NULL);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
/* Now we create a node with an empty parent */ /* Now we create a node with an empty parent */
result = dns_db_newversion(db, &new); result = dns_db_newversion(db, &new);
@ -362,7 +362,7 @@ ISC_LOOP_TEST_IMPL(version) {
/* look up the ENT; it should be empty */ /* look up the ENT; it should be empty */
dns_test_namefromstring("ent.name.test.test.", &fname); dns_test_namefromstring("ent.name.test.test.", &fname);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
result = dns_db_find(db, name, new, dns_rdatatype_a, 0, 0, &node, result = dns_db_find(db, name, new, dns_rdatatype_a, 0, 0, &node,
foundname, &rdataset, NULL); foundname, &rdataset, NULL);
assert_int_equal(result, DNS_R_EMPTYNAME); assert_int_equal(result, DNS_R_EMPTYNAME);
@ -380,7 +380,7 @@ ISC_LOOP_TEST_IMPL(version) {
dns_rdataset_disassociate(&rdataset); dns_rdataset_disassociate(&rdataset);
} }
if (node != NULL) { if (node != NULL) {
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
dns_db_closeversion(db, &ver, false); dns_db_closeversion(db, &ver, false);

View File

@ -96,7 +96,7 @@ test_walk(const char *filename, int flags, int nodes) {
DNS_DBITERATOR_FOREACH (iter) { DNS_DBITERATOR_FOREACH (iter) {
result = dns_dbiterator_current(iter, &node, name); result = dns_dbiterator_current(iter, &node, name);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
i++; i++;
} }
@ -150,7 +150,7 @@ test_reverse(const char *filename, int flags, int nodes) {
{ {
result = dns_dbiterator_current(iter, &node, name); result = dns_dbiterator_current(iter, &node, name);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
i++; i++;
} }
@ -214,7 +214,7 @@ test_seek_node(const char *filename, int flags, int nodes) {
while (result == ISC_R_SUCCESS) { while (result == ISC_R_SUCCESS) {
result = dns_dbiterator_current(iter, &node, name); result = dns_dbiterator_current(iter, &node, name);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
result = dns_dbiterator_next(iter); result = dns_dbiterator_next(iter);
i++; i++;
} }
@ -236,7 +236,7 @@ test_seek_node(const char *filename, int flags, int nodes) {
while (result == ISC_R_SUCCESS) { while (result == ISC_R_SUCCESS) {
result = dns_dbiterator_current(iter, &node, name); result = dns_dbiterator_current(iter, &node, name);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
result = dns_dbiterator_prev(iter); result = dns_dbiterator_prev(iter);
i++; i++;
} }

View File

@ -213,7 +213,7 @@ ISC_RUN_TEST_IMPL(allrdatasets) {
dns_rdatasetiter_destroy(&iterator); dns_rdatasetiter_destroy(&iterator);
assert_null(iterator); assert_null(iterator);
dns_db_detachnode(db1, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
} }
@ -244,7 +244,7 @@ ISC_RUN_TEST_IMPL(findrdataset) {
check_assertion(dns_db_findrdataset(db1, node, v2, dns_rdatatype_soa, 0, check_assertion(dns_db_findrdataset(db1, node, v2, dns_rdatatype_soa, 0,
0, &rdataset, NULL)); 0, &rdataset, NULL));
dns_db_detachnode(db1, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
} }
@ -266,7 +266,7 @@ ISC_RUN_TEST_IMPL(deleterdataset) {
check_assertion( check_assertion(
dns_db_deleterdataset(db1, node, v2, dns_rdatatype_soa, 0)); dns_db_deleterdataset(db1, node, v2, dns_rdatatype_soa, 0));
dns_db_detachnode(db1, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
} }
@ -305,7 +305,7 @@ ISC_RUN_TEST_IMPL(subtract) {
check_assertion( check_assertion(
dns_db_subtractrdataset(db1, node, v2, &rdataset, 0, NULL)); dns_db_subtractrdataset(db1, node, v2, &rdataset, 0, NULL));
dns_db_detachnode(db1, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
} }
@ -337,7 +337,7 @@ ISC_RUN_TEST_IMPL(addrdataset) {
check_assertion( check_assertion(
dns_db_addrdataset(db1, node, v2, 0, &rdataset, 0, NULL)); dns_db_addrdataset(db1, node, v2, 0, &rdataset, 0, NULL));
dns_db_detachnode(db1, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
} }
@ -415,7 +415,7 @@ ISC_RUN_TEST_IMPL(rollback) {
assert_int_equal(res, ISC_R_SUCCESS); assert_int_equal(res, ISC_R_SUCCESS);
dns_db_closeversion(db1, &v1, true); /* commit */ dns_db_closeversion(db1, &v1, true); /* commit */
assert_null(v1); assert_null(v1);
dns_db_detachnode(db1, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
/* db2: Insert the first version ("text 1"), and commit */ /* db2: Insert the first version ("text 1"), and commit */
@ -425,7 +425,7 @@ ISC_RUN_TEST_IMPL(rollback) {
assert_int_equal(res, ISC_R_SUCCESS); assert_int_equal(res, ISC_R_SUCCESS);
dns_db_closeversion(db2, &v2, true); /* commit */ dns_db_closeversion(db2, &v2, true); /* commit */
assert_null(v2); assert_null(v2);
dns_db_detachnode(db2, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
/* Reopen the versions */ /* Reopen the versions */
@ -441,7 +441,7 @@ ISC_RUN_TEST_IMPL(rollback) {
assert_int_equal(res, ISC_R_SUCCESS); assert_int_equal(res, ISC_R_SUCCESS);
dns_db_closeversion(db1, &v1, false); /* rollback */ dns_db_closeversion(db1, &v1, false); /* rollback */
assert_null(v1); assert_null(v1);
dns_db_detachnode(db1, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
/* db2: Insert the second version ("text 2"), and commit */ /* db2: Insert the second version ("text 2"), and commit */
@ -451,7 +451,7 @@ ISC_RUN_TEST_IMPL(rollback) {
assert_int_equal(res, ISC_R_SUCCESS); assert_int_equal(res, ISC_R_SUCCESS);
dns_db_closeversion(db2, &v2, true); /* commit */ dns_db_closeversion(db2, &v2, true); /* commit */
assert_null(v2); assert_null(v2);
dns_db_detachnode(db2, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
/* db1: Look it up and check that the first version is found */ /* db1: Look it up and check that the first version is found */
@ -479,7 +479,7 @@ ISC_RUN_TEST_IMPL(rollback) {
dns_db_closeversion(db1, &v1, true); dns_db_closeversion(db1, &v1, true);
assert_null(v1); assert_null(v1);
dns_db_detachnode(db1, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
/* db2: Look it up and check that the second version is found */ /* db2: Look it up and check that the second version is found */
@ -507,7 +507,7 @@ ISC_RUN_TEST_IMPL(rollback) {
dns_db_closeversion(db2, &v2, true); dns_db_closeversion(db2, &v2, true);
assert_null(v2); assert_null(v2);
dns_db_detachnode(db2, &node); dns_db_detachnode(&node);
assert_null(node); assert_null(node);
} }

View File

@ -109,7 +109,7 @@ overmempurge_addrdataset(dns_db_t *db, isc_stdtime_t now, int idx,
result = dns_db_addrdataset(db, node, NULL, now, &rdataset, 0, NULL); result = dns_db_addrdataset(db, node, NULL, now, &rdataset, 0, NULL);
assert_int_equal(result, ISC_R_SUCCESS); assert_int_equal(result, ISC_R_SUCCESS);
dns_db_detachnode(db, &node); dns_db_detachnode(&node);
} }
static void static void

View File

@ -109,10 +109,9 @@ ownercase_test_one(const char *str1, const char *str2) {
.common.methods = &qpdb_zonemethods, .common.methods = &qpdb_zonemethods,
.common.mctx = isc_g_mctx, .common.mctx = isc_g_mctx,
}; };
qpznode_t node = { .locknum = 0 }; qpznode_t node = { .methods = &qpznode_methods, .locknum = 0 };
dns_slabheader_t header = { dns_slabheader_t header = {
.node = (dns_dbnode_t *)&node, .node = (dns_dbnode_t *)&node,
.db = (dns_db_t *)qpdb,
}; };
unsigned char *raw = (unsigned char *)(&header) + sizeof(header); unsigned char *raw = (unsigned char *)(&header) + sizeof(header);
dns_rdataset_t rdataset = { dns_rdataset_t rdataset = {
@ -172,10 +171,9 @@ ISC_RUN_TEST_IMPL(setownercase) {
.common.methods = &qpdb_zonemethods, .common.methods = &qpdb_zonemethods,
.common.mctx = isc_g_mctx, .common.mctx = isc_g_mctx,
}; };
qpznode_t node = { .locknum = 0 }; qpznode_t node = { .methods = &qpznode_methods, .locknum = 0 };
dns_slabheader_t header = { dns_slabheader_t header = {
.node = (dns_dbnode_t *)&node, .node = (dns_dbnode_t *)&node,
.db = (dns_db_t *)qpdb,
}; };
unsigned char *raw = (unsigned char *)(&header) + sizeof(header); unsigned char *raw = (unsigned char *)(&header) + sizeof(header);
dns_rdataset_t rdataset = { dns_rdataset_t rdataset = {