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.
This commit is contained in:
Alessio Podda 2025-12-18 00:54:48 +01:00
parent f6e9998c3c
commit 0683d76025
2 changed files with 15 additions and 1 deletions

View 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);
}

View 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);