]> granicus.if.org Git - pdns/commitdiff
honour query-local-address and query-local-address6 for IXFR
authorbert hubert <bert.hubert@powerdns.com>
Tue, 7 Jun 2016 09:22:33 +0000 (11:22 +0200)
committerbert hubert <bert.hubert@powerdns.com>
Tue, 7 Jun 2016 09:25:01 +0000 (11:25 +0200)
pdns/slavecommunicator.cc

index ea472538695135db7d4b8270feb650d8c668c0ad..9562c21d48cb4c46e57163b2be80c245fddb5f8b 100644 (file)
@@ -338,6 +338,7 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
 
     vector<string> localaddr;
     ComboAddress laddr;
+    ComboAddress raddr(remote, 53);
     if(B.getDomainMetadata(domain, "AXFR-SOURCE", localaddr) && !localaddr.empty()) {
       try {
         laddr = ComboAddress(localaddr[0]);
@@ -347,8 +348,13 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
         L<<Logger::Error<<"Failed to load AXFR source '"<<localaddr[0]<<"' for incoming AXFR of '"<<domain<<"': "<<e.what()<<endl;
         return;
       }
-    } else { // should use global query-local-addr here! XXX
-      laddr.sin4.sin_family = 0;
+    } else { 
+      if(raddr.sin4.sin_family == AF_INET)
+        laddr=ComboAddress(::arg()["query-local-address"]);
+      else if(!::arg()["query-local-address6"].empty())
+        laddr=ComboAddress(::arg()["query-local-address6"]);
+      else
+        laddr.sin4.sin_family = 0;
     }
 
     bool hadDnssecZone = false;
@@ -357,7 +363,7 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
     NSEC3PARAMRecordContent hadNs3pr;
     bool hadNarrow=false;
 
-    ComboAddress raddr(remote, 53);
+
     vector<DNSResourceRecord> rrs;
     if(dk.isSecuredZone(domain)) {
       hadDnssecZone=true;
@@ -373,6 +379,7 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
       B.getDomainMetadata(domain, "IXFR", meta);
       if(!meta.empty() && meta[0]=="1") {
         vector<DNSRecord> axfr;
+        L<<Logger::Warning<<"Starting IXFR of '"<<domain<<"' from remote "<<raddr.toStringWithPort()<<endl;
         ixfrSuck(domain, tt, laddr, raddr, pdl, zs, &axfr);
         if(!axfr.empty()) {
           L<<Logger::Warning<<"IXFR of '"<<domain<<"' from remote '"<<raddr.toStringWithPort()<<"' turned into an AXFR"<<endl;