]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Fix generation of multiple-version updates
authorHåkan Lindqvist <h@qw.se>
Mon, 24 Oct 2022 17:26:54 +0000 (17:26 +0000)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Thu, 13 Apr 2023 10:57:30 +0000 (12:57 +0200)
See https://github.com/PowerDNS/pdns/issues/6880#issuecomment-420980817

(cherry picked from commit f821ff19dcd4ad1bb4e88d40913e40201d81c118)

pdns/ixfrdist.cc

index 6fb5ca7a655e9dd2d235e02b75342d1fda6f27d7..997fdf90121314c25d0e78915bebb2729662b525 100644 (file)
@@ -717,24 +717,34 @@ static bool handleIXFR(int fd, const ComboAddress& destination, const MOADNSPars
     return handleAXFR(fd, mdp);
   }
 
-  std::vector<std::vector<uint8_t>> 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;