Browse Source

[1574b] check multiple NSEC3PARAMs (not supported in this implementation)

JINMEI Tatuya 13 years ago
parent
commit
37c1b4a1d2

+ 7 - 0
src/lib/datasrc/memory_datasrc.cc

@@ -230,6 +230,13 @@ struct InMemoryZoneFinder::InMemoryZoneFinderImpl {
             isc_throw(AddError, "multiple RRs of singleton type for "
                       << rrset->getName());
         }
+        // NSEC3PARAM is not a "singleton" per protocol, but this
+        // implementation doesn't request it be so at the moment.
+        if (rrset->getType() == RRType::NSEC3PARAM() &&
+            rrset->getRdataCount() > 1) {
+            isc_throw(AddError, "Multiple NSEC3PARAM RDATA is given for "
+                      << rrset->getName() << " which isn't supported");
+        }
 
         NameComparisonResult compare(origin_.compare(rrset->getName()));
         if (compare.getRelation() != NameComparisonResult::SUPERDOMAIN &&

+ 9 - 0
src/lib/datasrc/tests/memory_datasrc_unittest.cc

@@ -1478,6 +1478,15 @@ TEST_F(InMemoryZoneFinderTest, badRRsigForNSEC3) {
                  InMemoryZoneFinder::AddError);
 }
 
+TEST_F(InMemoryZoneFinderTest, multiNSEC3PARAM) {
+    // In this current implementation multiple NSEC3PARAM isn't supported.
+    RRsetPtr nsec3param(new RRset(Name("example.org"), RRClass::IN(),
+                                  RRType::NSEC3PARAM(), RRTTL(300)));
+    nsec3param->addRdata(generic::NSEC3PARAM("1 0 12 aabbccdd"));
+    nsec3param->addRdata(generic::NSEC3PARAM("1 1 1 ddccbbaa"));
+    EXPECT_THROW(zone_finder_.add(nsec3param), InMemoryZoneFinder::AddError);
+}
+
 // TODO
 // - parameter consistency
 // - existence of NSEC3PARAM