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