From: Libor Peltan Date: Fri, 5 Dec 2025 09:14:34 +0000 (+0100) Subject: zone/include_from(flattening): delete whole subtree of glues and junk from parent X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fmerge-requests%2F1831%2Fhead;p=thirdparty%2Fknot-dns.git zone/include_from(flattening): delete whole subtree of glues and junk from parent --- diff --git a/src/knot/zone/reverse.c b/src/knot/zone/reverse.c index fedbed4df7..937eb11d3f 100644 --- a/src/knot/zone/reverse.c +++ b/src/knot/zone/reverse.c @@ -116,12 +116,6 @@ static bool flatten_apex_nocopy(uint16_t type) type == KNOT_RRTYPE_CDS; } -static bool flatten_apex_delete(uint16_t type) -{ - return type == KNOT_RRTYPE_NS || - type == KNOT_RRTYPE_DS; -} - static int flatten_from_node(zone_node_t *node, void *data) { rev_ctx_t *ctx = data; @@ -130,33 +124,22 @@ static int flatten_from_node(zone_node_t *node, void *data) int ret = KNOT_EOK; - zone_node_t *target_node = NULL; + assert(ctx->rev_upd == NULL); // not implemented with update in mind + if (apex) { + ret = zone_tree_del_subtree(ctx->rev_conts->nodes, node->owner, false); + } + + zone_node_t *target_node = NULL; for (int i = 0; i < node->rrset_count && ret == KNOT_EOK; i++) { knot_rrset_t rrset = node_rrset_at(node, i); if (apex && flatten_apex_nocopy(rrset.type)) { continue; } - assert(ctx->rev_upd == NULL); // not implemented with update in mind - ret = zone_contents_add_rr(ctx->rev_conts, &rrset, &target_node); } - if (apex && target_node == NULL) { - target_node = (zone_node_t *)zone_contents_find_node(ctx->rev_conts, node->owner); - } - - // TODO delete whole subtree from rev_conts BEFORE adding records from included zone? - for (int i = 0; apex && target_node != NULL && i < target_node->rrset_count && ret == KNOT_EOK; ) { - knot_rrset_t rrset = node_rrset_at(target_node, i); - if (flatten_apex_delete(rrset.type)) { - ret = zone_contents_remove_rr(ctx->rev_conts, &rrset, &target_node); - } else { - i++; // NOTE otherwise we jump to next RRSet by deleting the current one - } - } - return ret; } @@ -225,7 +208,7 @@ int zones_reverse_log(zone_t *zone, zone_contents_t *to_conts) (void)knot_dname_to_str(forw_str, fail_fwd, sizeof(forw_str)); log_zone_warning(zone->name, "waiting for source forward zone '%s'", forw_str); } else if (ret != KNOT_EOK) { - log_zone_error(zone->name, "failed to generate reverse records"); + log_zone_error(zone->name, "failed to generate reverse records (%s)", knot_strerror(ret)); } return ret; } diff --git a/tests-extra/tests/zone/include_from/test.py b/tests-extra/tests/zone/include_from/test.py index 0cbbd14db2..a370988b77 100644 --- a/tests-extra/tests/zone/include_from/test.py +++ b/tests-extra/tests/zone/include_from/test.py @@ -43,12 +43,12 @@ for z in childs: r.check(rcode="NOERROR", rdata="192.0.2.1") r = slave.dig("dns1.org.cz", "A") -r.check(rcode="NOERROR", rdata="192.0.2.2") +r.check(rcode="NOERROR", nordata="192.0.2.2") r = slave.dig("com.cz.", "TXT") r.check(rcode="NOERROR", rdata="auth-txt") -r.check(rcode="NOERROR", rdata="nonauth-txt") -r.check_count(2, "TXT") +r.check(rcode="NOERROR", nordata="nonauth-txt") +r.check_count(1, "TXT") up = master.update(childs[0]) up.add("dns1", 3600, "AAAA", "1::2")