From: Alessio Podda Date: Wed, 17 Dec 2025 23:54:48 +0000 (+0100) Subject: Extract heap deregistration X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0683d76025c488826224fe74960295f82e55cfaf;p=thirdparty%2Fbind9.git Extract heap deregistration This commit changes the deregistration of vecheaders from the heap to go through a private api instead of the dyndb public one. This is safe since vecheader is only used by qpzone. This is done in order to facilitate further refactoring. --- diff --git a/lib/dns/qpzone.c b/lib/dns/qpzone.c index 2993d833c01..6c022c6a07c 100644 --- a/lib/dns/qpzone.c +++ b/lib/dns/qpzone.c @@ -68,6 +68,9 @@ #define HEADERNODE(h) ((qpznode_t *)((h)->node)) +/* Forward declaration */ +static void deletedata(dns_dbnode_t *node, void *data); + #define QPDB_ATTR_LOADED 0x01 #define QPDB_ATTR_LOADING 0x02 @@ -832,6 +835,7 @@ clean_multiple_headers(dns_vectop_t *top) { if (header->serial == parent_serial || IGNORE(header)) { ISC_SLIST_PTR_REMOVE(p, header, next_header); + deletedata(header->node, header); dns_vecheader_destroy(&header); } else { parent_serial = header->serial; @@ -855,6 +859,7 @@ clean_multiple_versions(dns_vectop_t *top, uint32_t least_serial) { dns_vecheader_t *header = *p; if (header->serial < least_serial) { ISC_SLIST_PTR_REMOVE(p, header, next_header); + deletedata(header->node, header); dns_vecheader_destroy(&header); } else { multiple = true; @@ -1846,6 +1851,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename, * alone. It will get cleaned up when * clean_zone_node() runs. */ + deletedata(newheader->node, newheader); dns_vecheader_destroy(&newheader); newheader = merged; dns_vecheader_reset(newheader, @@ -1870,6 +1876,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename, header->typepair), "updating", qpdb->maxrrperset); } + deletedata(newheader->node, newheader); dns_vecheader_destroy(&newheader); return result; } @@ -1896,6 +1903,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename, maybe_update_recordsandsize(false, version, header, nodename->length); + deletedata(header->node, header); dns_vecheader_destroy(&header); } else { if (RESIGN(newheader)) { @@ -1922,6 +1930,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename, * If we're trying to delete the type, don't bother. */ if (!EXISTS(newheader)) { + deletedata(newheader->node, newheader); dns_vecheader_destroy(&newheader); return DNS_R_UNCHANGED; } @@ -1957,6 +1966,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename, if (qpdb->maxtypepername > 0 && ntypes >= qpdb->maxtypepername) { + deletedata(newheader->node, newheader); dns_vecheader_destroy(&newheader); return DNS_R_TOOMANYRECORDS; } @@ -4920,6 +4930,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode, &subresult); } if (result == ISC_R_SUCCESS) { + deletedata(newheader->node, newheader); dns_vecheader_destroy(&newheader); newheader = subresult; dns_vecheader_reset(newheader, (dns_dbnode_t *)node); @@ -4952,6 +4963,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode, * This subtraction would remove all of the rdata; * add a nonexistent header instead. */ + deletedata(newheader->node, newheader); dns_vecheader_destroy(&newheader); newheader = dns_vecheader_new(db->mctx, (dns_dbnode_t *)node); @@ -4961,6 +4973,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode, DNS_VECHEADERATTR_NONEXISTENT); newheader->serial = version->serial; } else { + deletedata(newheader->node, newheader); dns_vecheader_destroy(&newheader); goto unlock; } @@ -4981,6 +4994,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode, * The rdataset doesn't exist, so we don't need to do anything * to satisfy the deletion request. */ + deletedata(newheader->node, newheader); dns_vecheader_destroy(&newheader); if ((options & DNS_DBSUB_EXACT) != 0) { result = DNS_R_NOTEXACT; @@ -5575,6 +5589,7 @@ static void destroy_qpznode(qpznode_t *node) { ISC_SLIST_FOREACH(top, node->next_type, next_type) { ISC_SLIST_FOREACH(header, top->headers, next_header) { + deletedata(header->node, header); dns_vecheader_destroy(&header); } diff --git a/lib/dns/rdatavec.c b/lib/dns/rdatavec.c index 62bc189b47d..7ae9331c036 100644 --- a/lib/dns/rdatavec.c +++ b/lib/dns/rdatavec.c @@ -821,7 +821,6 @@ dns_vecheader_destroy(dns_vecheader_t **headerp) { *headerp = NULL; isc_mem_t *mctx = header->node->mctx; - dns_db_deletedata(header->node, header); if (EXISTS(header)) { size = dns_rdatavec_size(header);