Skip to content
Snippets Groups Projects
Commit 1f2f8a9c authored by Jan Včelák's avatar Jan Včelák :rocket:
Browse files

DNSSEC: use zone diff when deleting NSEC3 chain

refs #4
parent 4e1f28aa
Branches
Tags
No related merge requests found
......@@ -786,64 +786,11 @@ static int create_nsec3_chain(const knot_zone_contents_t *zone, uint32_t ttl,
return result;
}
/* - deleting NSEC3 chain -------------------------------------------------- */
typedef struct {
knot_changeset_t *changeset;
int result;
} nsec3_chain_delete_data_t;
static int copy_node_and_delete(const knot_rrset_t *rrset,
knot_changeset_t *changeset)
{
knot_rrset_t *copy = NULL;
int result = knot_rrset_deep_copy_no_sig(rrset, &copy);
if (result != KNOT_EOK) {
return result;
}
result = knot_changeset_add_rrset(changeset, copy, KNOT_CHANGESET_REMOVE);
if (result != KNOT_EOK) {
knot_rrset_deep_free(&copy, 1);
}
return result;
}
static void delete_nsec3_chain_node_cb(knot_node_t **node_ptr, void *data)
{
assert(node_ptr && *node_ptr);
assert(data);
knot_node_t *node = *node_ptr;
nsec3_chain_delete_data_t *params = (nsec3_chain_delete_data_t *)data;
if (params->result != KNOT_EOK) {
return;
}
int result = KNOT_EOK;
for (int i = 0; i < node->rrset_count; i++) {
const knot_rrset_t *rrset = node->rrset_tree[i];
result = copy_node_and_delete(rrset, params->changeset);
if (result != KNOT_EOK) {
break;
}
result = copy_node_and_delete(rrset->rrsigs, params->changeset);
if (result != KNOT_EOK) {
break;
}
}
params->result = result;
}
static int delete_nsec3_chain(const knot_zone_contents_t *zone,
knot_changeset_t *changeset)
{
assert(zone);
assert(zone->nsec3_nodes);
assert(changeset);
if (knot_zone_tree_is_empty(zone->nsec3_nodes)) {
......@@ -851,16 +798,17 @@ static int delete_nsec3_chain(const knot_zone_contents_t *zone,
}
dbg_dnssec_detail("deleting NSEC3 chain\n");
knot_zone_tree_t *empty_tree = knot_zone_tree_create();
if (!empty_tree) {
return KNOT_ENOMEM;
}
nsec3_chain_delete_data_t cb_data = {
.changeset = changeset,
.result = KNOT_EOK
};
int result = knot_zone_tree_add_diff(zone->nsec3_nodes, empty_tree,
changeset);
knot_zone_tree_apply(zone->nsec3_nodes, delete_nsec3_chain_node_cb,
&cb_data);
knot_zone_tree_free(&empty_tree);
return cb_data.result;
return result;
}
/* - helper functions ------------------------------------------------------ */
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment