]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
update/dnssec: cancel-out in update's changeset while signing update
authorLibor Peltan <libor.peltan@nic.cz>
Wed, 22 May 2019 11:51:15 +0000 (13:51 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Thu, 23 May 2019 08:41:44 +0000 (10:41 +0200)
src/knot/dnssec/zone-events.c
src/knot/updates/zone-update.c
src/knot/updates/zone-update.h

index 8f47d14a21911c8fe65b6a2d8a515ff57d152031..93a6705c1eec6bd28469a1df6834528e2d917463 100644 (file)
@@ -242,6 +242,8 @@ int knot_dnssec_sign_update(zone_update_t *update, zone_sign_reschedule_t *resch
        kdnssec_ctx_t ctx = { 0 };
        zone_keyset_t keyset = { 0 };
 
+       update->flags |= UPDATE_CANCELOUT;
+
        // signing pipeline
 
        result = sign_init(update->new_cont, 0, 0, update->zone->kaspdb, &ctx, reschedule);
index 35cee77fe87b38fc805a2eb8850a4c6d1a28a563..c9545393dee17af4b3b12ece2ce6fb6524df078b 100644 (file)
@@ -350,6 +350,15 @@ void zone_update_clear(zone_update_t *update)
        memset(update, 0, sizeof(*update));
 }
 
+static changeset_flag_t changeset_flags(const zone_update_t *update)
+{
+       if ((update->flags & UPDATE_CANCELOUT)) {
+               return CHANGESET_CHECK | CHANGESET_CHECK_CANCELOUT;
+       } else {
+               return CHANGESET_CHECK;
+       }
+}
+
 int zone_update_add(zone_update_t *update, const knot_rrset_t *rrset)
 {
        if (update == NULL || rrset == NULL) {
@@ -357,7 +366,7 @@ int zone_update_add(zone_update_t *update, const knot_rrset_t *rrset)
        }
 
        if (update->flags & UPDATE_INCREMENTAL) {
-               int ret = changeset_add_addition(&update->change, rrset, CHANGESET_CHECK);
+               int ret = changeset_add_addition(&update->change, rrset, changeset_flags(update));
                if (ret != KNOT_EOK) {
                        return ret;
                }
@@ -413,7 +422,7 @@ int zone_update_remove(zone_update_t *update, const knot_rrset_t *rrset)
        }
 
        if (update->flags & UPDATE_INCREMENTAL) {
-               int ret = changeset_add_removal(&update->change, rrset, CHANGESET_CHECK);
+               int ret = changeset_add_removal(&update->change, rrset, changeset_flags(update));
                if (ret != KNOT_EOK) {
                        return ret;
                }
@@ -456,7 +465,7 @@ int zone_update_remove_rrset(zone_update_t *update, knot_dname_t *owner, uint16_
                                return KNOT_ENOENT;
                        }
                        int ret = changeset_add_removal(&update->change, &rrset,
-                                                       CHANGESET_CHECK);
+                                                       changeset_flags(update));
                        if (ret != KNOT_EOK) {
                                return ret;
                        }
@@ -504,7 +513,7 @@ int zone_update_remove_node(zone_update_t *update, const knot_dname_t *owner)
                        for (int i = 0; i < rrset_count; ++i) {
                                knot_rrset_t rrset = node_rrset_at(node, rrset_count - 1 - i);
                                int ret = changeset_add_removal(&update->change, &rrset,
-                                                               CHANGESET_CHECK);
+                                                               changeset_flags(update));
                                if (ret != KNOT_EOK) {
                                        return ret;
                                }
index a22e98959b7ba1f7a5dc2a33c6f0d9abfdd33225..9f680119928d3f74606555bac3fe0a75068310f4 100644 (file)
@@ -47,6 +47,7 @@ typedef enum {
        UPDATE_SIGN           = 1 << 2, /*!< Sign the resulting zone. */
        UPDATE_JOURNAL        = 1 << 3, /*!< Using zone-in-journal for a diff update. */
        UPDATE_STRICT         = 1 << 4, /*!< Apply changes strictly, i.e. fail when removing nonexistent RR. */
+       UPDATE_CANCELOUT      = 1 << 5, /*!< When adding to changeset, cancel-out what has been both added and removed. */
 } zone_update_flags_t;
 
 /*!