From: JINMEI Tatuya Date: Tue, 13 Nov 2012 01:48:33 +0000 (-0800) Subject: [2420] catch the rare case of RRSIG-only for NSEC3 X-Git-Tag: bind10-1.0.0-beta-release~52^2~1^2~2^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=38f650c71af54bc238221b540dd2fa302a862885;p=thirdparty%2Fkea.git [2420] catch the rare case of RRSIG-only for NSEC3 --- diff --git a/src/lib/datasrc/memory/zone_finder.cc b/src/lib/datasrc/memory/zone_finder.cc index f6a5c8d2aa..4240c21d63 100644 --- a/src/lib/datasrc/memory/zone_finder.cc +++ b/src/lib/datasrc/memory/zone_finder.cc @@ -216,6 +216,14 @@ createNSEC3RRset(const ZoneNode* node, const RRClass& rrclass) { assert(rdataset != NULL); assert(rdataset->type == RRType::NSEC3()); + // Check for the rare case of RRSIG-only record; in theory it could exist + // but we simply consider it broken for NSEC3. + if (rdataset->getRdataCount() == 0) { + uint8_t labels_buf[LabelSequence::MAX_SERIALIZED_LENGTH]; + isc_throw(DataSourceError, "Broken zone: RRSIG-only NSEC3 record at " + << node->getAbsoluteLabels(labels_buf) << "/" << rrclass); + } + // Create the RRset. Note the DNSSEC flag: NSEC3 implies DNSSEC. return (createTreeNodeRRset(node, rdataset, rrclass, ZoneFinder::FIND_DNSSEC)); diff --git a/src/lib/datasrc/tests/memory/zone_finder_unittest.cc b/src/lib/datasrc/tests/memory/zone_finder_unittest.cc index 3df1179885..f1121194ea 100644 --- a/src/lib/datasrc/tests/memory/zone_finder_unittest.cc +++ b/src/lib/datasrc/tests/memory/zone_finder_unittest.cc @@ -1549,4 +1549,17 @@ TEST_F(InMemoryZoneFinderNSEC3Test, findNSEC3Walk) { } } } + +TEST_F(InMemoryZoneFinderNSEC3Test, RRSIGOnly) { + // add an RRSIG-only NSEC3 to the NSEC3 space, and try to find it; it + // should result in an exception. + const string n8_hash = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"; + updater_.add(ConstRRsetPtr(), + textToRRset( + n8_hash + ".example.org. 300 IN RRSIG NSEC3 5 3 300 " + "20120814220826 20120715220826 1234 example.com. FAKE")); + EXPECT_THROW(zone_finder_.findNSEC3(Name("n8.example.org"), false), + DataSourceError); +} + }