From: HÃ¥kan Lindqvist Date: Mon, 24 Oct 2022 17:26:54 +0000 (+0000) Subject: Fix generation of multiple-version updates X-Git-Tag: dnsdist-1.8.0-rc1~151^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f821ff19dcd4ad1bb4e88d40913e40201d81c118;p=thirdparty%2Fpdns.git Fix generation of multiple-version updates See https://github.com/PowerDNS/pdns/issues/6880#issuecomment-420980817 --- diff --git a/pdns/ixfrdist.cc b/pdns/ixfrdist.cc index aea08ee066..24ac0e6a3a 100644 --- a/pdns/ixfrdist.cc +++ b/pdns/ixfrdist.cc @@ -717,24 +717,34 @@ static bool handleIXFR(int fd, const ComboAddress& destination, const MOADNSPars return handleAXFR(fd, mdp); } - std::vector> packets; - for (const auto& diff : toSend) { - /* An IXFR packet's ANSWER section looks as follows: - * SOA new_serial - * SOA old_serial - * ... removed records ... - * SOA new_serial - * ... added records ... - * SOA new_serial - */ + /* An IXFR packet's ANSWER section looks as follows: + * SOA latest_serial C + + First set of changes: + * SOA requested_serial A + * ... removed records ... + * SOA intermediate_serial B + * ... added records ... + + Next set of changes: + * SOA intermediate_serial B + * ... removed records ... + * SOA latest_serial C + * ... added records ... + + * SOA latest_serial C + */ + + const auto latestSOAPacket = getSOAPacket(mdp, zoneInfo->soa, zoneInfo->soaTTL); + if (!sendPacketOverTCP(fd, latestSOAPacket)) { + return false; + } + + for (const auto& diff : toSend) { const auto newSOAPacket = getSOAPacket(mdp, diff->newSOA, diff->newSOATTL); const auto oldSOAPacket = getSOAPacket(mdp, diff->oldSOA, diff->oldSOATTL); - if (!sendPacketOverTCP(fd, newSOAPacket)) { - return false; - } - if (!sendPacketOverTCP(fd, oldSOAPacket)) { return false; } @@ -750,10 +760,10 @@ static bool handleIXFR(int fd, const ComboAddress& destination, const MOADNSPars if (!sendRecordsOverTCP(fd, mdp, diff->additions)) { return false; } + } - if (!sendPacketOverTCP(fd, newSOAPacket)) { - return false; - } + if (!sendPacketOverTCP(fd, latestSOAPacket)) { + return false; } return true;