Browse Source

[1574b] test the case of adding NSEC3PARAM at non origin

JINMEI Tatuya 13 years ago
parent
commit
97d02ec04e

+ 4 - 3
src/lib/datasrc/memory_datasrc.cc

@@ -476,9 +476,10 @@ struct InMemoryZoneFinder::InMemoryZoneFinderImpl {
                 node->setFlag(DomainNode::FLAG_CALLBACK);
             }
 
-            // If we've added NSEC3PARAM, set up NSEC3 specific data or check
-            // consistency with already set up parameters.
-            if (rrset->getType() == RRType::NSEC3PARAM()) {
+            // If we've added NSEC3PARAM at zone origin, set up NSEC3 specific
+            // data or check consistency with already set up parameters.
+            if (rrset->getType() == RRType::NSEC3PARAM() &&
+                rrset->getName() == origin_) {
                 // We know rrset has exactly one RDATA
                 const generic::NSEC3PARAM& param =
                     dynamic_cast<const generic::NSEC3PARAM&>(

+ 12 - 1
src/lib/datasrc/tests/memory_datasrc_unittest.cc

@@ -1531,7 +1531,18 @@ TEST_F(InMemoryZoneFinderTest, multiNSEC3PARAM) {
     EXPECT_THROW(zone_finder_.add(nsec3param), InMemoryZoneFinder::AddError);
 }
 
+TEST_F(InMemoryZoneFinderTest, nonOriginNSEC3PARAM) {
+    // This is a normal NSEC3PARAM at the zone origin
+    EXPECT_EQ(result::SUCCESS,
+              zone_finder_.add(textToRRset("example.org. 300 IN NSEC3PARAM "
+                                           "1 0 12 aabbccdd")));
+    // Add another (with different param) at a non origin node.  This is
+    // awkward, but the implementation accepts it as an ordinary RR.
+    EXPECT_EQ(result::SUCCESS,
+              zone_finder_.add(textToRRset("a.example.org. 300 IN NSEC3PARAM "
+                                           "1 1 1 aabbccdd")));
+}
+
 // TODO
 // - existence of NSEC3PARAM
-// - add NSEC3PARAM at non origin (should be ignored)
 }