]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
bugfix adjust: nsec3pointer and nsec3wildcard when nsec3param changed
authorLibor Peltan <libor.peltan@nic.cz>
Tue, 5 Nov 2019 16:40:17 +0000 (17:40 +0100)
committerLibor Peltan <libor.peltan@nic.cz>
Wed, 6 Nov 2019 12:13:16 +0000 (13:13 +0100)
src/knot/zone/adjust.c
src/knot/zone/adjust.h

index 8d54a2f20561ffae7f4f994b8d1bd2785135a27e..b54566069f00e428f2f8ddd272e900cc48515416 100644 (file)
@@ -66,6 +66,10 @@ int adjust_cb_wildcard_nsec3(zone_node_t *node, adjust_ctx_t *ctx)
                return KNOT_EOK;
        }
 
+       if (ctx->nsec3_param_changed) {
+               node->nsec3_wildcard_name = NULL;
+       }
+
        if (node->nsec3_wildcard_name != NULL) {
                return KNOT_EOK;
        }
@@ -133,7 +137,18 @@ int adjust_cb_nsec3_pointer(zone_node_t *node, adjust_ctx_t *ctx)
 {
        uint16_t flags_orig = node->flags;
        zone_node_t *ptr_orig = node->nsec3_node;
-       int ret = binode_fix_nsec3_pointer(node, ctx->zone);
+       int ret = KNOT_EOK;
+       if (ctx->nsec3_param_changed) {
+               if (!(node->flags & NODE_FLAGS_NSEC3_NODE) &&
+                   node->nsec3_hash != binode_counterpart(node)->nsec3_hash) {
+                       free(node->nsec3_hash);
+               }
+               node->nsec3_hash = NULL;
+               node->flags &= ~NODE_FLAGS_NSEC3_NODE;
+               (void)node_nsec3_node(node, ctx->zone);
+       } else {
+               ret = binode_fix_nsec3_pointer(node, ctx->zone);
+       }
        if (ret == KNOT_EOK && ctx->changed_nodes != NULL &&
            (flags_orig != node->flags || ptr_orig != node->nsec3_node)) {
                ret = zone_tree_insert(ctx->changed_nodes, &node);
@@ -355,7 +370,7 @@ int zone_adjust_contents(zone_contents_t *zone, adjust_cb_t nodes_cb, adjust_cb_
        zone->dnssec = node_rrtype_is_signed(zone->apex, KNOT_RRTYPE_SOA);
 
        measure_t m = knot_measure_init(measure_zone, false);
-       adjust_ctx_t ctx = { zone, add_changed };
+       adjust_ctx_t ctx = { zone, add_changed, true };
 
        if (nsec3_cb != NULL) {
                ret = zone_adjust_tree(zone->nsec3_nodes, &ctx, nsec3_cb, true, &m);
@@ -373,7 +388,7 @@ int zone_adjust_update(zone_update_t *update, adjust_cb_t nodes_cb, adjust_cb_t
 {
        int ret = KNOT_EOK;
        measure_t m = knot_measure_init(false, measure_diff);
-       adjust_ctx_t ctx = { update->new_cont, update->a_ctx->adjust_ptrs };
+       adjust_ctx_t ctx = { update->new_cont, update->a_ctx->adjust_ptrs, zone_update_changed_nsec3param(update) };
 
        if (nsec3_cb != NULL) {
                ret = zone_adjust_tree(update->a_ctx->nsec3_ptrs, &ctx, nsec3_cb, false, &m);
@@ -421,7 +436,7 @@ int zone_adjust_incremental_update(zone_update_t *update)
                return ret;
        }
        bool nsec3change = zone_update_changed_nsec3param(update);
-       adjust_ctx_t ctx = { update->new_cont, update->a_ctx->adjust_ptrs };
+       adjust_ctx_t ctx = { update->new_cont, update->a_ctx->adjust_ptrs, nsec3change };
 
        ret = zone_adjust_contents(update->new_cont, adjust_cb_flags, adjust_cb_nsec3_flags, false, update->a_ctx->adjust_ptrs);
        if (ret == KNOT_EOK) {
index bdd2357f346683ce5ca90716ad6c5c1523b45ce8..45d2363829c5070116811980e4d2a93a20d9609a 100644 (file)
@@ -22,6 +22,7 @@
 typedef struct {
        const zone_contents_t *zone;
        zone_tree_t *changed_nodes;
+       bool nsec3_param_changed;
 } adjust_ctx_t;
 
 typedef int (*adjust_cb_t)(zone_node_t *, adjust_ctx_t *);