diff --git a/CHANGES b/CHANGES index d2cda38462..0e91dabf8d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +6362. [bug] Reduce memory consumption of QP-trie based databases + by dynamically allocating the nodenames. [GL #4614] + 6361. [bug] Some invalid ISO 8601 durations were accepted erroneously. [GL #4624] diff --git a/lib/dns/forward.c b/lib/dns/forward.c index f48a3dc076..b186aacee4 100644 --- a/lib/dns/forward.c +++ b/lib/dns/forward.c @@ -75,13 +75,13 @@ new_forwarders(isc_mem_t *mctx, const dns_name_t *name, forwarders = isc_mem_get(mctx, sizeof(*forwarders)); *forwarders = (dns_forwarders_t){ .fwdpolicy = fwdpolicy, + .name = DNS_NAME_INITEMPTY, .fwdrs = ISC_LIST_INITIALIZER, }; isc_mem_attach(mctx, &forwarders->mctx); isc_refcount_init(&forwarders->references, 1); - forwarders->name = dns_fixedname_initname(&forwarders->fn); - dns_name_copy(name, forwarders->name); + dns_name_dupwithoffsets(name, mctx, &forwarders->name); return (forwarders); } @@ -212,6 +212,7 @@ destroy_forwarders(dns_forwarders_t *forwarders) { } isc_mem_put(forwarders->mctx, fwd, sizeof(*fwd)); } + dns_name_free(&forwarders->name, forwarders->mctx); isc_mem_putanddetach(&forwarders->mctx, forwarders, sizeof(*forwarders)); } @@ -240,7 +241,7 @@ static size_t qp_makekey(dns_qpkey_t key, void *uctx ISC_ATTR_UNUSED, void *pval, uint32_t ival ISC_ATTR_UNUSED) { dns_forwarders_t *fwd = pval; - return (dns_qpkey_fromname(key, fwd->name)); + return (dns_qpkey_fromname(key, &fwd->name)); } static void diff --git a/lib/dns/include/dns/forward.h b/lib/dns/include/dns/forward.h index e300a9555c..4da882943a 100644 --- a/lib/dns/include/dns/forward.h +++ b/lib/dns/include/dns/forward.h @@ -42,8 +42,7 @@ struct dns_forwarders { dns_fwdpolicy_t fwdpolicy; isc_mem_t *mctx; isc_refcount_t references; - dns_fixedname_t fn; - dns_name_t *name; + dns_name_t name; }; void diff --git a/lib/dns/keytable.c b/lib/dns/keytable.c index 7284140951..7429e68c6e 100644 --- a/lib/dns/keytable.c +++ b/lib/dns/keytable.c @@ -51,8 +51,7 @@ struct dns_keynode { isc_mem_t *mctx; isc_refcount_t references; isc_rwlock_t rwlock; - dns_fixedname_t fn; - dns_name_t *name; + dns_name_t name; dns_rdatalist_t *dslist; dns_rdataset_t dsset; bool managed; @@ -119,6 +118,7 @@ destroy_keynode(dns_keynode_t *knode) { knode->dslist = NULL; } + dns_name_free(&knode->name, knode->mctx); isc_mem_putanddetach(&knode->mctx, knode, sizeof(dns_keynode_t)); } @@ -272,7 +272,7 @@ delete_ds(dns_qp_t *qp, dns_keytable_t *keytable, dns_keynode_t *knode, /* * Replace knode with a new instance without the DS. */ - newnode = new_keynode(knode->name, NULL, keytable, knode->managed, + newnode = new_keynode(&knode->name, NULL, keytable, knode->managed, knode->initial); for (rdata = ISC_LIST_HEAD(knode->dslist->rdata); rdata != NULL; rdata = ISC_LIST_NEXT(rdata, link)) @@ -285,7 +285,7 @@ delete_ds(dns_qp_t *qp, dns_keytable_t *keytable, dns_keynode_t *knode, } } - result = dns_qp_deletename(qp, knode->name, &pval, NULL); + result = dns_qp_deletename(qp, &knode->name, &pval, NULL); INSIST(result == ISC_R_SUCCESS); INSIST(pval == knode); @@ -312,14 +312,14 @@ new_keynode(const dns_name_t *name, dns_rdata_ds_t *ds, REQUIRE(!initial || managed); knode = isc_mem_get(keytable->mctx, sizeof(dns_keynode_t)); - *knode = (dns_keynode_t){ .magic = KEYNODE_MAGIC }; + *knode = (dns_keynode_t){ .name = DNS_NAME_INITEMPTY, + .magic = KEYNODE_MAGIC }; dns_rdataset_init(&knode->dsset); isc_refcount_init(&knode->references, 1); isc_rwlock_init(&knode->rwlock); - knode->name = dns_fixedname_initname(&knode->fn); - dns_name_copy(name, knode->name); + dns_name_dupwithoffsets(name, keytable->mctx, &knode->name); /* * If a DS was supplied, initialize an rdatalist. @@ -522,7 +522,7 @@ dns_keytable_finddeepestmatch(dns_keytable_t *keytable, const dns_name_t *name, keynode = pval; if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) { - dns_name_copy(keynode->name, foundname); + dns_name_copy(&keynode->name, foundname); result = ISC_R_SUCCESS; } @@ -551,7 +551,7 @@ dns_keytable_issecuredomain(dns_keytable_t *keytable, const dns_name_t *name, if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) { keynode = pval; if (foundname != NULL) { - dns_name_copy(keynode->name, foundname); + dns_name_copy(&keynode->name, foundname); } *wantdnssecp = true; result = ISC_R_SUCCESS; @@ -618,7 +618,7 @@ keynode_dslist_totext(dns_keynode_t *keynode, isc_buffer_t **text) { return (ISC_R_SUCCESS); } - dns_name_format(keynode->name, namebuf, sizeof(namebuf)); + dns_name_format(&keynode->name, namebuf, sizeof(namebuf)); for (result = dns_rdataset_first(&dsset); result == ISC_R_SUCCESS; result = dns_rdataset_next(&dsset)) @@ -694,7 +694,7 @@ dns_keytable_forall(dns_keytable_t *keytable, while (dns_qpiter_next(&iter, NULL, &pval, NULL) == ISC_R_SUCCESS) { dns_keynode_t *knode = pval; - (*func)(keytable, knode, knode->name, arg); + (*func)(keytable, knode, &knode->name, arg); } dns_qpread_destroy(keytable->table, &qpr); @@ -844,7 +844,7 @@ static size_t qp_makekey(dns_qpkey_t key, void *uctx ISC_ATTR_UNUSED, void *pval, uint32_t ival ISC_ATTR_UNUSED) { dns_keynode_t *keynode = pval; - return (dns_qpkey_fromname(key, keynode->name)); + return (dns_qpkey_fromname(key, &keynode->name)); } static void diff --git a/lib/dns/nametree.c b/lib/dns/nametree.c index f2b3232726..77ecd309b8 100644 --- a/lib/dns/nametree.c +++ b/lib/dns/nametree.c @@ -41,8 +41,7 @@ struct dns_nametree { struct dns_ntnode { isc_mem_t *mctx; isc_refcount_t references; - dns_fixedname_t fn; - dns_name_t *name; + dns_name_t name; bool set; uint8_t *bits; }; @@ -70,6 +69,7 @@ destroy_ntnode(dns_ntnode_t *node) { isc_mem_cput(node->mctx, node->bits, node->bits[0], sizeof(char)); } + dns_name_free(&node->name, node->mctx); isc_mem_putanddetach(&node->mctx, node, sizeof(dns_ntnode_t)); } @@ -104,20 +104,8 @@ dns_nametree_create(isc_mem_t *mctx, dns_nametree_type_t type, const char *name, static void destroy_nametree(dns_nametree_t *nametree) { - /* dns_qpread_t qpr; */ - /* dns_qpiter_t iter; */ - /* void *pval = NULL; */ - nametree->magic = 0; - /* dns_qpmulti_query(nametree->table, &qpr); */ - /* dns_qpiter_init(&qpr, &iter); */ - /* while (dns_qpiter_next(&iter, &pval, NULL) == ISC_R_SUCCESS) { */ - /* dns_ntnode_t *n = pval; */ - /* dns_ntnode_detach(&n); */ - /* } */ - /* dns_qpread_destroy(nametree->table, &qpr); */ - dns_qpmulti_destroy(&nametree->table); isc_mem_putanddetach(&nametree->mctx, nametree, sizeof(*nametree)); @@ -132,12 +120,13 @@ ISC_REFCOUNT_IMPL(dns_nametree, destroy_nametree); static dns_ntnode_t * newnode(isc_mem_t *mctx, const dns_name_t *name) { dns_ntnode_t *node = isc_mem_get(mctx, sizeof(*node)); - *node = (dns_ntnode_t){ 0 }; + *node = (dns_ntnode_t){ + .name = DNS_NAME_INITEMPTY, + }; isc_mem_attach(mctx, &node->mctx); isc_refcount_init(&node->references, 1); - node->name = dns_fixedname_initname(&node->fn); - dns_name_copy(name, node->name); + dns_name_dupwithoffsets(name, mctx, &node->name); return (node); } @@ -327,7 +316,7 @@ static size_t qp_makekey(dns_qpkey_t key, void *uctx ISC_ATTR_UNUSED, void *pval, uint32_t ival ISC_ATTR_UNUSED) { dns_ntnode_t *ntnode = pval; - return (dns_qpkey_fromname(key, ntnode->name)); + return (dns_qpkey_fromname(key, &ntnode->name)); } static void diff --git a/lib/dns/nta.c b/lib/dns/nta.c index ce00b25d8a..dad45a1ec0 100644 --- a/lib/dns/nta.c +++ b/lib/dns/nta.c @@ -60,8 +60,7 @@ struct dns__nta { dns_fetch_t *fetch; dns_rdataset_t rdataset; dns_rdataset_t sigrdataset; - dns_fixedname_t fn; - dns_name_t *name; + dns_name_t name; isc_stdtime_t expiry; bool shuttingdown; }; @@ -104,6 +103,7 @@ dns__nta_destroy(dns__nta_t *nta) { dns_resolver_destroyfetch(&nta->fetch); } isc_loop_detach(&nta->loop); + dns_name_free(&nta->name, nta->mctx); isc_mem_putanddetach(&nta->mctx, nta, sizeof(*nta)); } @@ -240,9 +240,9 @@ checkbogus(void *arg) { dns__nta_ref(nta); /* for dns_resolver_createfetch */ result = dns_resolver_createfetch( - resolver, nta->name, dns_rdatatype_nsec, NULL, NULL, NULL, NULL, - 0, DNS_FETCHOPT_NONTA, 0, NULL, nta->loop, fetch_done, nta, - &nta->rdataset, &nta->sigrdataset, &nta->fetch); + resolver, &nta->name, dns_rdatatype_nsec, NULL, NULL, NULL, + NULL, 0, DNS_FETCHOPT_NONTA, 0, NULL, nta->loop, fetch_done, + nta, &nta->rdataset, &nta->sigrdataset, &nta->fetch); if (result != ISC_R_SUCCESS) { dns__nta_detach(&nta); /* for dns_resolver_createfetch() */ } @@ -278,6 +278,7 @@ nta_create(dns_ntatable_t *ntatable, const dns_name_t *name, nta = isc_mem_get(ntatable->mctx, sizeof(dns__nta_t)); *nta = (dns__nta_t){ .ntatable = ntatable, + .name = DNS_NAME_INITEMPTY, .magic = NTA_MAGIC, }; isc_mem_attach(ntatable->mctx, &nta->mctx); @@ -288,8 +289,7 @@ nta_create(dns_ntatable_t *ntatable, const dns_name_t *name, isc_refcount_init(&nta->references, 1); - nta->name = dns_fixedname_initname(&nta->fn); - dns_name_copy(name, nta->name); + dns_name_dupwithoffsets(name, nta->mctx, &nta->name); *target = nta; } @@ -316,7 +316,7 @@ dns_ntatable_add(dns_ntatable_t *ntatable, const dns_name_t *name, bool force, result = dns_qp_insert(qp, nta, 0); switch (result) { case ISC_R_EXISTS: - result = dns_qp_getname(qp, nta->name, &pval, NULL); + result = dns_qp_getname(qp, &nta->name, &pval, NULL); if (result == ISC_R_SUCCESS) { /* * an NTA already existed: throw away the @@ -379,16 +379,16 @@ delete_expired(void *arg) { RWLOCK(&ntatable->rwlock, isc_rwlocktype_write); dns_qpmulti_write(ntatable->table, &qp); - result = dns_qp_getname(qp, nta->name, &pval, NULL); + result = dns_qp_getname(qp, &nta->name, &pval, NULL); if (result == ISC_R_SUCCESS && ((dns__nta_t *)pval)->expiry == nta->expiry && !nta->shuttingdown) { char nb[DNS_NAME_FORMATSIZE]; - dns_name_format(nta->name, nb, sizeof(nb)); + dns_name_format(&nta->name, nb, sizeof(nb)); isc_log_write(dns_lctx, DNS_LOGCATEGORY_DNSSEC, DNS_LOGMODULE_NTA, ISC_LOG_INFO, "deleting expired NTA at %s", nb); - dns_qp_deletename(qp, nta->name, NULL, NULL); + dns_qp_deletename(qp, &nta->name, NULL, NULL); dns__nta_shutdown(nta); dns__nta_unref(nta); } @@ -425,7 +425,7 @@ dns_ntatable_covered(dns_ntatable_t *ntatable, isc_stdtime_t now, * Found a NTA that's an ancestor of 'name'; we * now have to make sure 'anchor' isn't below it. */ - if (!dns_name_issubdomain(nta->name, anchor)) { + if (!dns_name_issubdomain(&nta->name, anchor)) { goto done; } /* Ancestor match */ @@ -487,7 +487,7 @@ dns_ntatable_totext(dns_ntatable_t *ntatable, const char *view, sizeof("expired: \n")]; isc_time_t t; - dns_name_format(n->name, nbuf, sizeof(nbuf)); + dns_name_format(&n->name, nbuf, sizeof(nbuf)); if (n->expiry != 0xffffffffU) { /* Normal NTA entries */ @@ -549,7 +549,7 @@ dns_ntatable_save(dns_ntatable_t *ntatable, FILE *fp) { } isc_buffer_init(&b, nbuf, sizeof(nbuf)); - result = dns_name_totext(n->name, 0, &b); + result = dns_name_totext(&n->name, 0, &b); if (result != ISC_R_SUCCESS) { continue; } @@ -586,7 +586,7 @@ dns__nta_shutdown_cb(void *arg) { if (isc_log_wouldlog(dns_lctx, ISC_LOG_DEBUG(3))) { char nb[DNS_NAME_FORMATSIZE]; - dns_name_format(nta->name, nb, sizeof(nb)); + dns_name_format(&nta->name, nb, sizeof(nb)); isc_log_write(dns_lctx, DNS_LOGCATEGORY_DNSSEC, DNS_LOGMODULE_NTA, ISC_LOG_DEBUG(3), "shutting down NTA %p at %s", nta, nb); @@ -650,7 +650,7 @@ static size_t qp_makekey(dns_qpkey_t key, void *uctx ISC_ATTR_UNUSED, void *pval, uint32_t ival ISC_ATTR_UNUSED) { dns__nta_t *nta = pval; - return (dns_qpkey_fromname(key, nta->name)); + return (dns_qpkey_fromname(key, &nta->name)); } static void diff --git a/lib/dns/qpcache.c b/lib/dns/qpcache.c index 481a20ad0b..1b5f5ceb7c 100644 --- a/lib/dns/qpcache.c +++ b/lib/dns/qpcache.c @@ -216,13 +216,7 @@ struct dns_qpdata { unsigned int : 0; /* end of bitfields c/o tree lock */ /*@}*/ - /*% - * This is needed for hashing. - */ - unsigned int hashval; - - dns_fixedname_t fn; - dns_name_t *name; + dns_name_t name; isc_mem_t *mctx; /*% @@ -409,7 +403,7 @@ static size_t qp_makekey(dns_qpkey_t key, void *uctx ISC_ATTR_UNUSED, void *pval, uint32_t ival ISC_ATTR_UNUSED) { dns_qpdata_t *data = pval; - return (dns_qpkey_fromname(key, data->name)); + return (dns_qpkey_fromname(key, &data->name)); } static void @@ -672,7 +666,7 @@ delete_node(dns_qpdb_t *qpdb, dns_qpdata_t *node) { if (isc_log_wouldlog(dns_lctx, ISC_LOG_DEBUG(1))) { char printname[DNS_NAME_FORMATSIZE]; - dns_name_format(node->name, printname, sizeof(printname)); + dns_name_format(&node->name, printname, sizeof(printname)); isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), "delete_node(): %p %s (bucket %d)", node, @@ -685,7 +679,7 @@ delete_node(dns_qpdb_t *qpdb, dns_qpdata_t *node) { * Delete the corresponding node from the auxiliary NSEC * tree before deleting from the main tree. */ - result = dns_qp_deletename(qpdb->nsec, node->name, NULL, NULL); + result = dns_qp_deletename(qpdb->nsec, &node->name, NULL, NULL); if (result != ISC_R_SUCCESS) { isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, @@ -695,13 +689,14 @@ delete_node(dns_qpdb_t *qpdb, dns_qpdata_t *node) { } /* FALLTHROUGH */ case DNS_DB_NSEC_NORMAL: - result = dns_qp_deletename(qpdb->tree, node->name, NULL, NULL); + result = dns_qp_deletename(qpdb->tree, &node->name, NULL, NULL); break; case DNS_DB_NSEC_NSEC: - result = dns_qp_deletename(qpdb->nsec, node->name, NULL, NULL); + result = dns_qp_deletename(qpdb->nsec, &node->name, NULL, NULL); break; case DNS_DB_NSEC_NSEC3: - result = dns_qp_deletename(qpdb->nsec3, node->name, NULL, NULL); + result = dns_qp_deletename(qpdb->nsec3, &node->name, NULL, + NULL); break; } if (result != ISC_R_SUCCESS) { @@ -1486,7 +1481,7 @@ find_deepest_zonecut(qpdb_search_t *search, dns_qpdata_t *node, * anything else. */ if (foundname != NULL) { - dns_name_copy(node->name, foundname); + dns_name_copy(&node->name, foundname); } result = DNS_R_DELEGATION; if (nodep != NULL) { @@ -2860,13 +2855,12 @@ new_qpdata(dns_qpdb_t *qpdb, const dns_name_t *name) { dns_qpdata_t *newdata = isc_mem_get(qpdb->common.mctx, sizeof(*newdata)); *newdata = (dns_qpdata_t){ + .name = DNS_NAME_INITEMPTY, .references = ISC_REFCOUNT_INITIALIZER(1), }; - newdata->hashval = dns_name_hash(name); - newdata->locknum = newdata->hashval % qpdb->node_lock_count; - newdata->name = dns_fixedname_initname(&newdata->fn); - dns_name_copy(name, newdata->name); + newdata->locknum = dns_name_hash(name) % qpdb->node_lock_count; isc_mem_attach(qpdb->common.mctx, &newdata->mctx); + dns_name_dupwithoffsets(name, newdata->mctx, &newdata->name); ISC_LINK_INIT(newdata, deadlink); @@ -3594,7 +3588,7 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, } name = dns_fixedname_initname(&fixed); - dns_name_copy(qpnode->name, name); + dns_name_copy(&qpnode->name, name); dns_rdataset_getownercase(rdataset, name); newheader = (dns_slabheader_t *)region.base; @@ -4491,7 +4485,7 @@ dbiterator_seek(dns_dbiterator_t *iterator, if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) { qpdbiter->new_origin = true; - dns_name_copy(qpdbiter->node->name, qpdbiter->name); + dns_name_copy(&qpdbiter->node->name, qpdbiter->name); reference_iter_node(qpdbiter DNS__DB_FLARG_PASS); } else { qpdbiter->node = NULL; @@ -4642,7 +4636,7 @@ dbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep, } if (name != NULL) { - dns_name_copy(qpdbiter->node->name, name); + dns_name_copy(&qpdbiter->node->name, name); if (qpdbiter->common.relative_names && qpdbiter->new_origin) { result = DNS_R_NEWORIGIN; @@ -4807,6 +4801,7 @@ qpdata_destroy(dns_qpdata_t *data) { dns_slabheader_destroy(¤t); } + dns_name_free(&data->name, data->mctx); isc_mem_putanddetach(&data->mctx, data, sizeof(dns_qpdata_t)); } diff --git a/lib/dns/qpzone.c b/lib/dns/qpzone.c index 615e3e7c53..19cc64f9ce 100644 --- a/lib/dns/qpzone.c +++ b/lib/dns/qpzone.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -150,8 +151,7 @@ struct qpdb_version { typedef ISC_LIST(qpdb_version_t) qpdb_versionlist_t; struct qpdata { - dns_fixedname_t fn; - dns_name_t *name; + dns_name_t name; isc_mem_t *mctx; isc_refcount_t references; isc_refcount_t erefs; @@ -597,11 +597,11 @@ static qpdata_t * new_qpdata(qpzonedb_t *qpdb, const dns_name_t *name) { qpdata_t *newdata = isc_mem_get(qpdb->common.mctx, sizeof(*newdata)); *newdata = (qpdata_t){ + .name = DNS_NAME_INITEMPTY, .references = ISC_REFCOUNT_INITIALIZER(1), }; newdata->locknum = dns_name_hash(name) % qpdb->node_lock_count; - newdata->name = dns_fixedname_initname(&newdata->fn); - dns_name_copy(name, newdata->name); + dns_name_dupwithoffsets(name, qpdb->common.mctx, &newdata->name); isc_mem_attach(qpdb->common.mctx, &newdata->mctx); #if DNS_DB_NODETRACE @@ -2517,7 +2517,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, rdataset DNS__DB_FLARG_PASS); if (foundname != NULL) { - dns_name_copy(HEADERNODE(header)->name, foundname); + dns_name_copy(&HEADERNODE(header)->name, foundname); } NODE_UNLOCK(&qpdb->node_locks[locknum].lock, &nlocktype); @@ -2922,7 +2922,7 @@ find_wildcard(qpdb_search_t *search, qpdata_t **nodep, * Construct the wildcard name for this level. */ result = dns_name_concatenate(dns_wildcardname, - node->name, wname, NULL); + &node->name, wname, NULL); if (result != ISC_R_SUCCESS) { break; } @@ -3355,7 +3355,7 @@ check_zonecut(qpdata_t *node, void *arg DNS__DB_FLARG) { * is, we need to remember the node name. */ zcname = dns_fixedname_name(&search->zonecut_name); - dns_name_copy(node->name, zcname); + dns_name_copy(&node->name, zcname); search->copy_name = true; } } else { @@ -4604,7 +4604,7 @@ dbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep, REQUIRE(qpdbiter->node != NULL); if (name != NULL) { - dns_name_copy(qpdbiter->node->name, name); + dns_name_copy(&qpdbiter->node->name, name); } newref(qpdb, node DNS__DB_FLARG_PASS); @@ -4785,7 +4785,7 @@ addrdataset(dns_db_t *db, dns_dbnode_t *dbnode, dns_dbversion_t *dbversion, return (result); } - dns_name_copy(node->name, name); + dns_name_copy(&node->name, name); dns_rdataset_getownercase(rdataset, name); newheader = (dns_slabheader_t *)region.base; @@ -4923,7 +4923,7 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode, dns_dbversion_t *dbversion, rdataset->type != 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, ®ion, sizeof(dns_slabheader_t)); if (result != ISC_R_SUCCESS) { @@ -5113,7 +5113,7 @@ deleterdataset(dns_db_t *db, dns_dbnode_t *dbnode, dns_dbversion_t *dbversion, atomic_init(&newheader->attributes, DNS_SLABHEADERATTR_NONEXISTENT); newheader->serial = version->serial; - dns_name_copy(node->name, nodename); + dns_name_copy(&node->name, nodename); NODE_WRLOCK(&qpdb->node_locks[node->locknum].lock, &nlocktype); result = add(qpdb, node, nodename, version, newheader, DNS_DBADD_FORCE, @@ -5133,7 +5133,7 @@ nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name) { REQUIRE(name != NULL); NODE_RDLOCK(&qpdb->node_locks[qpnode->locknum].lock, &nlocktype); - dns_name_copy(qpnode->name, name); + dns_name_copy(&qpnode->name, name); NODE_UNLOCK(&qpdb->node_locks[qpnode->locknum].lock, &nlocktype); return (ISC_R_SUCCESS); } @@ -5372,7 +5372,7 @@ newglue(qpzonedb_t *qpdb, qpdb_version_t *version, qpdata_t *node, * determining which NS records in the delegation are * in-bailiwick). */ - dns_name_copy(node->name, ctx.nodename); + dns_name_copy(&node->name, ctx.nodename); (void)dns_rdataset_additionaldata(rdataset, dns_rootname, glue_nsdname_cb, &ctx); @@ -5487,6 +5487,7 @@ destroy_qpdata(qpdata_t *node) { dns_slabheader_destroy(¤t); } + dns_name_free(&node->name, node->mctx); isc_mem_putanddetach(&node->mctx, node, sizeof(qpdata_t)); } @@ -5514,7 +5515,7 @@ static size_t qp_makekey(dns_qpkey_t key, void *uctx ISC_ATTR_UNUSED, void *pval, uint32_t ival ISC_ATTR_UNUSED) { qpdata_t *data = pval; - return (dns_qpkey_fromname(key, data->name)); + return (dns_qpkey_fromname(key, &data->name)); } static void diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 0570ff45a2..4e1fc8ad90 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -3459,12 +3459,12 @@ fctx_getaddresses(fetchctx_t *fctx, bool badcache) { if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) { fwd = ISC_LIST_HEAD(forwarders->fwdrs); fctx->fwdpolicy = forwarders->fwdpolicy; - dns_name_copy(forwarders->name, fctx->fwdname); + dns_name_copy(&forwarders->name, fctx->fwdname); if (fctx->fwdpolicy == dns_fwdpolicy_only && - isstrictsubdomain(forwarders->name, fctx->domain)) + isstrictsubdomain(&forwarders->name, fctx->domain)) { fcount_decr(fctx); - dns_name_copy(forwarders->name, fctx->domain); + dns_name_copy(&forwarders->name, fctx->domain); result = fcount_incr(fctx, true); if (result != ISC_R_SUCCESS) { dns_forwarders_detach(&forwarders); @@ -4565,7 +4565,7 @@ fctx_create(dns_resolver_t *res, isc_loop_t *loop, const dns_name_t *name, &forwarders); if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) { fctx->fwdpolicy = forwarders->fwdpolicy; - dns_name_copy(forwarders->name, fctx->fwdname); + dns_name_copy(&forwarders->name, fctx->fwdname); dns_forwarders_detach(&forwarders); } @@ -6555,7 +6555,7 @@ name_external(const dns_name_t *name, dns_rdatatype_t type, fetchctx_t *fctx) { * See if the forwarder declaration is better. */ if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) { - bool better = !dns_name_equal(forwarders->name, + bool better = !dns_name_equal(&forwarders->name, fctx->fwdname); dns_forwarders_detach(&forwarders); return (better); diff --git a/lib/dns/rpz.c b/lib/dns/rpz.c index f2963cf265..d2ba6a54c3 100644 --- a/lib/dns/rpz.c +++ b/lib/dns/rpz.c @@ -174,8 +174,7 @@ struct dns_rpz_nm_zbits { */ typedef struct nmdata nmdata_t; struct nmdata { - dns_fixedname_t fn; - dns_name_t *name; + dns_name_t name; isc_mem_t *mctx; isc_refcount_t references; dns_rpz_nm_zbits_t set; @@ -1408,10 +1407,10 @@ new_nmdata(isc_mem_t *mctx, const dns_name_t *name, const nmdata_t *data) { *newdata = (nmdata_t){ .set = data->set, .wild = data->wild, + .name = DNS_NAME_INITEMPTY, .references = ISC_REFCOUNT_INITIALIZER(1), }; - newdata->name = dns_fixedname_initname(&newdata->fn); - dns_name_copy(name, newdata->name); + dns_name_dupwithoffsets(name, mctx, &newdata->name); isc_mem_attach(mctx, &newdata->mctx); #ifdef DNS_RPZ_TRACE @@ -2683,6 +2682,7 @@ dns_rpz_decode_cname(dns_rpz_zone_t *rpz, dns_rdataset_t *rdataset, static void destroy_nmdata(nmdata_t *data) { + dns_name_free(&data->name, data->mctx); isc_mem_putanddetach(&data->mctx, data, sizeof(nmdata_t)); } @@ -2710,7 +2710,7 @@ static size_t qp_makekey(dns_qpkey_t key, void *uctx ISC_ATTR_UNUSED, void *pval, uint32_t ival ISC_ATTR_UNUSED) { nmdata_t *data = pval; - return (dns_qpkey_fromname(key, data->name)); + return (dns_qpkey_fromname(key, &data->name)); } static void