]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
zone/include_from(flattening): delete whole subtree of glues and junk from parent 1831/head
authorLibor Peltan <libor.peltan@nic.cz>
Fri, 5 Dec 2025 09:14:34 +0000 (10:14 +0100)
committerDaniel Salzman <daniel.salzman@nic.cz>
Sun, 7 Dec 2025 20:35:17 +0000 (21:35 +0100)
src/knot/zone/reverse.c
tests-extra/tests/zone/include_from/test.py

index fedbed4df74961fad9443ed557d1c4035abee62f..937eb11d3f928e09ecaaf3b449160e14ef1568e3 100644 (file)
@@ -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;
 }
index 0cbbd14db28f7b8e0e51fe194555f2382f3ad849..a370988b77be8a91aac0cb5ed5b84e69d43355bb 100644 (file)
@@ -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")