]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Fix bindbackend's feedRecord to handle being slave for the root 3302/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 25 Jan 2016 09:40:45 +0000 (10:40 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 25 Jan 2016 09:40:45 +0000 (10:40 +0100)
Replace the out-of-zone check by using DNSName isPartOf().
Without this commit, importing the Yeti root zone via AXFR fails
with:

"Unable to feed record during incoming AXFR of '.':
out-of-zone data 'aaa..' during AXFR of zone '..'

because stripDomainSuffix("aaa.", ".") returns false.

modules/bindbackend/bindbackend2.cc

index f171352959fc19cdd73ddec2cce93a653cf1e7fc..c773784691d60f0bff0acc720aeff2d7064e4fce 100644 (file)
@@ -257,11 +257,23 @@ bool Bind2Backend::feedRecord(const DNSResourceRecord &rr, string *ordername)
   BB2DomainInfo bbd;
   safeGetBBDomainInfo(d_transaction_id, &bbd);
 
-  string name=bbd.d_name.toString();
-  string qname=rr.qname.toString();
-
-  if(!stripDomainSuffix(&qname, name))
-    throw DBException("out-of-zone data '"+qname+".' during AXFR of zone '"+name+".'");
+  string qname;
+  string name = bbd.d_name.toString();
+  if (bbd.d_name.empty()) {
+    qname = rr.qname.toString();
+  }
+  else if (rr.qname.isPartOf(bbd.d_name)) {
+    if (rr.qname == bbd.d_name) {
+      qname = "@";
+    }
+    else {
+      DNSName relName = rr.qname.makeRelative(bbd.d_name);
+      qname = relName.toStringNoDot();
+    }
+  }
+  else {
+    throw DBException("out-of-zone data '"+rr.qname.toString()+"' during AXFR of zone '"+bbd.d_name.toString()+"'");
+  }
 
   shared_ptr<DNSRecordContent> drc(DNSRecordContent::mastermake(rr.qtype.getCode(), 1, rr.content));
   string content = drc->getZoneRepresentation();