From 9f5c1c14aacdcfdb92621e28fad9708b04849dc1 Mon Sep 17 00:00:00 2001 From: Jan Vcelak <jv@fcelda.cz> Date: Sat, 14 Jan 2017 23:51:26 +0100 Subject: [PATCH] refresh: fix handling of AXFR-style IXFR when only SOA changes --- src/knot/events/handlers/refresh.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/knot/events/handlers/refresh.c b/src/knot/events/handlers/refresh.c index ae5fc9183d..3ec0c64c07 100644 --- a/src/knot/events/handlers/refresh.c +++ b/src/knot/events/handlers/refresh.c @@ -575,9 +575,22 @@ static bool ixfr_check_header(const knot_pktsection_t *answer) static bool ixfr_is_axfr(const knot_pktsection_t *answer) { - return answer->count >= 2 && - knot_pkt_rr(answer, 0)->type == KNOT_RRTYPE_SOA && - knot_pkt_rr(answer, 1)->type != KNOT_RRTYPE_SOA; + if (answer->count < 2) { + return false; + } + + const knot_rrset_t *rr_one = knot_pkt_rr(answer, 0); + const knot_rrset_t *rr_two = knot_pkt_rr(answer, 1); + + return ( + rr_one->type == KNOT_RRTYPE_SOA && + rr_two->type != KNOT_RRTYPE_SOA + ) || ( + answer->count == 2 && + rr_one->type == KNOT_RRTYPE_SOA && + rr_two->type == KNOT_RRTYPE_SOA && + knot_rrset_equal(rr_one, rr_two, KNOT_RRSET_COMPARE_WHOLE) + ); } static int ixfr_consume(knot_pkt_t *pkt, struct refresh_data *data) -- GitLab