]> granicus.if.org Git - pdns/commitdiff
SuffixMatchNode: Fix insertion issue for an existing node
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 12 Dec 2016 16:16:11 +0000 (17:16 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 12 Dec 2016 16:16:11 +0000 (17:16 +0100)
If the node we are about to insert already existed as an intermediary
one, we need to mark it as an end node.

pdns/dnsname.hh
pdns/test-dnsname_cc.cc

index 47f33a0ebb6f446d43ef0c47bb7b4ee0b30aafb2..fecff61f9e0701daa11922be811334d2bf735082 100644 (file)
@@ -256,7 +256,12 @@ struct SuffixMatchNode
       endNode=true;
     }
     else if(labels.size()==1) {
-      children.insert(SuffixMatchNode(*labels.begin(), true));
+      auto res=children.insert(SuffixMatchNode(*labels.begin(), true));
+      if(!res.second) {
+        if(!res.first->endNode) {
+          res.first->endNode = true;
+        }
+      }
     }
     else {
       auto res=children.insert(SuffixMatchNode(*labels.rbegin(), false));
index 2622302d96cae8f5ab97575f3535081c45be690b..5e6c5041c4bbec608e43c383665f6b78a254fd03 100644 (file)
@@ -491,6 +491,13 @@ BOOST_AUTO_TEST_CASE(test_suffixmatch) {
 
   smn.add(g_rootdnsname); // block the root
   BOOST_CHECK(smn.check(DNSName("a.root-servers.net.")));
+
+  DNSName examplenet("example.net.");
+  DNSName net("net.");
+  smn.add(examplenet);
+  smn.add(net);
+  BOOST_CHECK(smn.check(examplenet));
+  BOOST_CHECK(smn.check(net));
 }