]> granicus.if.org Git - pdns/commitdiff
DNAME: properly remove CNAME from auth answers
authorPieter Lexis <pieter.lexis@powerdns.com>
Wed, 13 Mar 2019 09:59:54 +0000 (10:59 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Wed, 13 Mar 2019 09:59:54 +0000 (10:59 +0100)
pdns/syncres.cc

index fc8dc8d9fe5bef3b3a1b7902b9660a7aa2308ba7..dbb2fd91e9e0e2e964c04a2304997cfde2fc523e 100644 (file)
@@ -2620,6 +2620,15 @@ bool SyncRes::processRecords(const std::string& prefix, const DNSName& qname, co
           dnameOwner = rec.d_name;
           dnameTarget = content->getTarget();
           dnameTTL = rec.d_ttl;
+          if (!newtarget.empty()) { // We had a CNAME before, remove it from ret so we don't cache it
+            ret.erase(std::remove_if(
+                  ret.begin(),
+                  ret.end(),
+                  [&qname](DNSRecord& rr) {
+                    return (rr.d_place == DNSResourceRecord::ANSWER && rr.d_type == QType::CNAME && rr.d_name == qname);
+                  }),
+                  ret.end());
+          }
           try {
             newtarget = qname.makeRelative(dnameOwner) + dnameTarget;
           } catch (const std::exception &e) {