Skip to content
Snippets Groups Projects
Commit 419f96d0 authored by Libor Peltan's avatar Libor Peltan Committed by Daniel Salzman
Browse files

bugfix: when rrset TTL changed by RR addition, put this change to journal

parent edaf21f5
No related branches found
No related tags found
1 merge request!1054bugfix: when rrset TTL changed by RR addition, put this change to journal
Pipeline #52009 passed
......@@ -252,16 +252,7 @@ int apply_add_rr(apply_ctx_t *ctx, const knot_rrset_t *rr)
// Insert new RR to RRSet, data will be copied.
ret = node_add_rrset(node, rr, NULL);
if (ret == KNOT_ETTL) {
char buff[KNOT_DNAME_TXT_MAXLEN + 1];
char *owner = knot_dname_to_str(buff, rr->owner, sizeof(buff));
if (owner == NULL) {
owner = "";
}
char type[16] = { '\0' };
knot_rrtype_to_string(rr->type, type, sizeof(type));
log_zone_notice(contents->apex->owner,
"TTL mismatch, owner %s, type %s, "
"TTL set to %u", owner, type, rr->ttl);
// this shall not happen except applying journal created before this bugfix
return KNOT_EOK;
}
return ret;
......
......@@ -387,14 +387,51 @@ void zone_update_clear(zone_update_t *update)
memset(update, 0, sizeof(*update));
}
static int solve_add_different_ttl(zone_update_t *update, const knot_rrset_t *add)
{
const zone_node_t *exist_node = zone_contents_find_node(update->new_cont, add->owner);
const knot_rrset_t exist_rr = node_rrset(exist_node, add->type);
if (knot_rrset_empty(&exist_rr) || exist_rr.ttl == add->ttl) {
return KNOT_EOK;
}
char buff[KNOT_DNAME_TXT_MAXLEN + 1];
char *owner = knot_dname_to_str(buff, add->owner, sizeof(buff));
if (owner == NULL) {
owner = "";
}
char type[16] = { '\0' };
knot_rrtype_to_string(add->type, type, sizeof(type));
log_zone_notice(update->zone->name, "TTL mismatch, owner %s, type %s, "
"TTL set to %u", owner, type, add->ttl);
knot_rrset_t *exist_copy = knot_rrset_copy(&exist_rr, NULL);
if (exist_copy == NULL) {
return KNOT_ENOMEM;
}
int ret = zone_update_remove(update, exist_copy);
if (ret == KNOT_EOK) {
exist_copy->ttl = add->ttl;
ret = zone_update_add(update, exist_copy);
}
knot_rrset_free(exist_copy, NULL);
return ret;
}
int zone_update_add(zone_update_t *update, const knot_rrset_t *rrset)
{
if (update == NULL || rrset == NULL) {
return KNOT_EINVAL;
}
if (knot_rrset_empty(rrset)) {
return KNOT_EOK;
}
if (update->flags & (UPDATE_INCREMENTAL | UPDATE_HYBRID)) {
int ret = changeset_add_addition(&update->change, rrset, CHANGESET_CHECK);
int ret = solve_add_different_ttl(update, rrset);
if (ret == KNOT_EOK) {
ret = changeset_add_addition(&update->change, rrset, CHANGESET_CHECK);
}
if (ret == KNOT_EOK && (update->flags & UPDATE_EXTRA_CHSET)) {
ret = changeset_add_addition(&update->extra_ch, rrset, CHANGESET_CHECK);
}
......
#!/usr/bin/env python3
'''Test for IXFR from Knot to Bind with TTL changed by RR addition'''
from dnstest.test import Test
t = Test()
master = t.server("knot")
slave = t.server("bind")
zones = t.zone("example.com.")
t.link(zones, master, slave, ixfr=True)
t.start()
serials_init = slave.zones_wait(zones)
up = master.update(zones)
up.add("example.com.", 500, "MX", "20 dns1")
up.send("NOERROR")
slave.zones_wait(zones, serials_init)
t.xfr_diff(master, slave, zones, serials_init)
t.end()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment