]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Extract heap deregistration
authorAlessio Podda <alessio@isc.org>
Wed, 17 Dec 2025 23:54:48 +0000 (00:54 +0100)
committerAlessio Podda <alessio@isc.org>
Tue, 31 Mar 2026 14:22:56 +0000 (16:22 +0200)
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.

lib/dns/qpzone.c
lib/dns/rdatavec.c

index 2993d833c014d5711001e5afdfd0633fc2925959..6c022c6a07c3b7788e1f1b2ababab2454acfb4ab 100644 (file)
@@ -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);
                }
 
index 62bc189b47d68658636fdf4aeb1622f2ea31c3fd..7ae9331c036810a9e30dbd5ce90f35b25fa56aad 100644 (file)
@@ -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);