Browse Source

[2504] Fix getClosestNSEC() when tree.find() results in SUBDOMAIN

When tree.find() results in SUBDOMAIN, the node_path's top contains the
previous node.  Calling previousNode() yet again will return its
further previous node.
Mukund Sivaraman 12 years ago
parent
commit
4a9ea530ab
1 changed files with 11 additions and 2 deletions
  1. 11 2
      src/lib/datasrc/memory/zone_finder.cc

+ 11 - 2
src/lib/datasrc/memory/zone_finder.cc

@@ -305,8 +305,16 @@ getClosestNSEC(const ZoneData& zone_data,
     }
 
     const ZoneNode* prev_node;
-    while ((prev_node = zone_data.getZoneTree().previousNode(node_path))
-           != NULL) {
+    if (node_path.getLastComparisonResult().getRelation() ==
+        NameComparisonResult::SUBDOMAIN) {
+         // In case the search ended as a sub-domain, the previous node
+         // is already at the top of node_path.
+         prev_node = node_path.getLastComparedNode();
+    } else {
+         prev_node = zone_data.getZoneTree().previousNode(node_path);
+    }
+
+    while (prev_node != NULL) {
         if (!prev_node->isEmpty()) {
             const RdataSet* found =
                 RdataSet::find(prev_node->getData(), RRType::NSEC());
@@ -314,6 +322,7 @@ getClosestNSEC(const ZoneData& zone_data,
                 return (ConstNodeRRset(prev_node, found));
             }
         }
+        prev_node = zone_data.getZoneTree().previousNode(node_path);
     }
     // This must be impossible and should be an internal bug.
     // See the description at the method declaration.