From 77a00c141f6734938a32d34a8018a70ba93e7807 Mon Sep 17 00:00:00 2001 From: Jan Kadlec <jan.kadlec@nic.cz> Date: Thu, 5 Dec 2013 15:41:50 +0100 Subject: [PATCH] DNSSEC/chain fix - do not fix NSEC for non-auth nodes. --- src/libknot/dnssec/zone-nsec.c | 17 ++++++++++++----- src/libknot/dnssec/zone-sign.c | 3 ++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/libknot/dnssec/zone-nsec.c b/src/libknot/dnssec/zone-nsec.c index 1454ed6992..5a02c0a3b1 100644 --- a/src/libknot/dnssec/zone-nsec.c +++ b/src/libknot/dnssec/zone-nsec.c @@ -1016,6 +1016,10 @@ static int update_nsec(const knot_node_t *from, const knot_node_t *to, bool is_apex) { assert(from && to && out_ch); + if (knot_node_is_non_auth(from) || knot_node_is_non_auth(to)) { + printf("FIX TODO do not call this function with non auth nodes\n"); + return KNOT_EOK; + } const knot_rrset_t *nsec_rrset = knot_node_rrset(from, KNOT_RRTYPE_NSEC); // Create new NSEC @@ -1038,6 +1042,7 @@ static int update_nsec(const knot_node_t *from, const knot_node_t *to, dbg_dnssec_detail("Creating new NSEC for %s\n", knot_dname_to_str(new_nsec->owner)); // Drop old + printf("FIX removing1 %s\n", knot_dname_to_str(nsec_rrset->owner)); int ret = changeset_remove_nsec(nsec_rrset, out_ch); if (ret != KNOT_EOK) { @@ -1066,6 +1071,7 @@ static int update_nsec(const knot_node_t *from, const knot_node_t *to, } } else { // Drop old, no longer needed + printf("FIX removing2 %s\n", knot_dname_to_str(nsec_rrset->owner)); int ret = changeset_remove_nsec(nsec_rrset, out_ch); if (ret != KNOT_EOK) { @@ -1142,14 +1148,14 @@ static int fix_nsec_chain(knot_dname_t *a, knot_dname_t *b, void *d) bool dname_equal = a ? knot_dname_is_equal(prev_zone_node->owner, a) : false; if (dname_equal && !node_deleted) { - printf("FIX v changesetu: %s %s\n", knot_dname_to_str(a), + printf("FIX OP: changeset: %s %s\n", knot_dname_to_str(a), knot_dname_to_str(b)); return update_nsec(a_node, b_node, fix_data->out_ch, 3600, prev_zone_node == fix_data->zone->apex); } else { if (fix_data->next_dname && !knot_dname_is_equal(fix_data->next_dname, b) && !node_deleted) { - printf("FIX next %s next = %s\n", a ? knot_dname_to_str(a) : knot_dname_to_str(b), knot_dname_to_str(fix_data->next_dname)); + printf("FIX OP: next %s next = %s\n", a ? knot_dname_to_str(a) : knot_dname_to_str(b), knot_dname_to_str(fix_data->next_dname)); int ret = update_nsec(a ? a_node : b_node, knot_zone_contents_find_node(fix_data->zone, fix_data->next_dname), @@ -1165,10 +1171,11 @@ static int fix_nsec_chain(knot_dname_t *a, knot_dname_t *b, void *d) fix_data->next_dname = knot_rdata_nsec_next(nsec_rrset); printf("FIX next_dname storing %s\n", knot_dname_to_str(fix_data->next_dname)); // Fix NSEC - printf("FIX zona %s %s\n", + const knot_node_t *next_node = node_deleted ? knot_zone_contents_find_node(fix_data->zone, knot_rdata_nsec_next(old_nsec)) : b_node; + printf("FIX OP: zone %s %s\n", knot_dname_to_str(prev_zone_node->owner), - knot_dname_to_str(b)); - return update_nsec(prev_zone_node, node_deleted ? knot_zone_contents_find_node(fix_data->zone, knot_rdata_nsec_next(old_nsec)) : b_node, fix_data->out_ch, + knot_dname_to_str(next_node->owner)); + return update_nsec(prev_zone_node, next_node, fix_data->out_ch, 3600, prev_zone_node == fix_data->zone->apex); } diff --git a/src/libknot/dnssec/zone-sign.c b/src/libknot/dnssec/zone-sign.c index 7470b3216a..6bb778fe87 100644 --- a/src/libknot/dnssec/zone-sign.c +++ b/src/libknot/dnssec/zone-sign.c @@ -1081,7 +1081,8 @@ static int sign_changeset_wrap(knot_rrset_t *chg_rrset, void *data) } else { /*! * RRSet dropped from zone using update, or should not - * be signed, but it could create a new node + * be signed, but it could create a new node, so we + * have to mark the change. */ rr_already_signed(chg_rrset, args->signed_tree); } -- GitLab