Parcourir la source

[2218] Insert using the NSEC3 record's entire name into the NSEC3Data tree

Mukund Sivaraman il y a 12 ans
Parent
commit
8887127030

+ 4 - 1
src/lib/datasrc/memory/memory_client.cc

@@ -325,12 +325,15 @@ public:
             }
         }
 
+        // Make just the NSEC3 hash label uppercase, and insert the
+        // entire name into the NSEC3Data ZoneTree.
         string fst_label = rrset->getName().split(0, 1).toText(true);
         transform(fst_label.begin(), fst_label.end(), fst_label.begin(),
                   ::toupper);
+        const string rest = rrset->getName().split(1).toText(true);
 
         ZoneNode* node;
-        nsec3_data->insertName(mem_sgmt_, Name(fst_label), &node);
+        nsec3_data->insertName(mem_sgmt_, Name(fst_label + "." + rest), &node);
 
         RdataEncoder encoder;
 

+ 4 - 2
src/lib/datasrc/memory/tests/zone_finder_unittest.cc

@@ -280,13 +280,15 @@ public:
              }
         }
 
+        // Make just the NSEC3 hash label uppercase, and insert the
+        // entire name into the NSEC3Data ZoneTree.
         string fst_label = rrset->getName().split(0, 1).toText(true);
         transform(fst_label.begin(), fst_label.end(), fst_label.begin(),
                   ::toupper);
+        const string rest = rrset->getName().split(1).toText(true);
 
         ZoneNode *node;
-        nsec3_data->insertName(mem_sgmt_, Name(fst_label), &node);
-
+        nsec3_data->insertName(mem_sgmt_, Name(fst_label + "." + rest), &node);
 
         // We assume that rrsig has already been checked to match rrset
         // by the caller.

+ 8 - 7
src/lib/datasrc/memory/zone_finder.cc

@@ -663,12 +663,12 @@ InMemoryZoneFinder::findNSEC3(const isc::dns::Name& name, bool recursive) {
     // the deepest label one by one, until we find a name that has a matching
     // NSEC3 hash.
     for (unsigned int labels = qlabels; labels >= olabels; --labels) {
-        const std::string hlabel =
-             (nsec3_calculate_)((labels == qlabels ?
-                                 name : name.split(qlabels - labels, labels)),
-                                nsec3_data->iterations,
-                                nsec3_data->getSaltData(),
-                                nsec3_data->getSaltLen());
+        const std::string hlabel = (nsec3_calculate_)
+            ((labels == qlabels ?
+              name : name.split(qlabels - labels, labels)),
+             nsec3_data->iterations,
+             nsec3_data->getSaltData(),
+             nsec3_data->getSaltLen());
 
         LOG_DEBUG(logger, DBG_TRACE_BASIC, DATASRC_MEM_FINDNSEC3_TRYHASH).
             arg(name).arg(labels).arg(hlabel);
@@ -678,7 +678,8 @@ InMemoryZoneFinder::findNSEC3(const isc::dns::Name& name, bool recursive) {
         ZoneNode* node(NULL);
         ZoneChain chain;
 
-        ZoneTree::Result result = tree.find(Name(hlabel), &node, chain);
+        ZoneTree::Result result =
+            tree.find(Name(hlabel + "." + getOrigin().toText()), &node, chain);
 
         if (result == ZoneTree::EXACTMATCH) {
             // We found an exact match.