]> granicus.if.org Git - pdns/commitdiff
getFakeAAAARecords: strip double CNAME records
authorPieter Lexis <pieter.lexis@powerdns.com>
Fri, 11 Jan 2019 13:51:37 +0000 (14:51 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Fri, 11 Jan 2019 14:05:38 +0000 (15:05 +0100)
pdns/lua-recursor4.cc

index d0f1af10a26c06c7b71186734326444c6470ef6a..ddf7722203d54b6c84ad9de88b36b82168bdb87b 100644 (file)
@@ -65,6 +65,27 @@ static int getFakeAAAARecords(const DNSName& qname, const std::string& prefix, v
 
   ComboAddress prefixAddress(prefix);
 
+  // Remove double CNAME records
+  std::set<DNSName> seenCNAMEs;
+  ret.erase(std::remove_if(
+        ret.begin(),
+        ret.end(),
+        [&seenCNAMEs](DNSRecord& rr) {
+          if (rr.d_type == QType::CNAME) {
+            auto target = getRR<CNAMERecordContent>(rr);
+            if (target == nullptr) {
+              return false;
+            }
+            if (seenCNAMEs.count(target->getTarget()) > 0) {
+              // We've had this CNAME before, remove it
+              return true;
+            }
+            seenCNAMEs.insert(target->getTarget());
+          }
+          return false;
+        }),
+      ret.end());
+
   for(DNSRecord& rr :  ret)
   {
     if(rr.d_type == QType::A && rr.d_place==DNSResourceRecord::ANSWER) {