Commit bb38dbf0 authored by JINMEI Tatuya's avatar JINMEI Tatuya
Browse files

[2420] re-create updater in clearZoneData() to avoid referencing invalid data

parent c42c6b93
......@@ -28,6 +28,8 @@
#include <gtest/gtest.h>
#include <boost/scoped_ptr.hpp>
#include <cassert>
using isc::testutils::textToRRset;
......@@ -41,7 +43,7 @@ protected:
ZoneDataUpdaterTest() :
zname_("example.org"), zclass_(RRClass::IN()),
zone_data_(ZoneData::create(mem_sgmt_, zname_)),
updater_(mem_sgmt_, zclass_, zname_, *zone_data_)
updater_(new ZoneDataUpdater(mem_sgmt_, zclass_, zname_, *zone_data_))
{}
~ZoneDataUpdaterTest() {
// Make sure zone data is destroyed even if a test results in exception
......@@ -53,6 +55,8 @@ protected:
assert(zone_data_ != NULL);
ZoneData::destroy(mem_sgmt_, zone_data_, zclass_);
zone_data_ = ZoneData::create(mem_sgmt_, zname_);
updater_.reset(new ZoneDataUpdater(mem_sgmt_, zclass_, zname_,
*zone_data_));
}
void TearDown() {
......@@ -66,12 +70,12 @@ protected:
const RRClass zclass_;
test::MemorySegmentTest mem_sgmt_;
ZoneData* zone_data_;
ZoneDataUpdater updater_;
boost::scoped_ptr<ZoneDataUpdater> updater_;
};
TEST_F(ZoneDataUpdaterTest, bothNull) {
// At least either covered RRset or RRSIG must be non NULL.
EXPECT_THROW(updater_.add(ConstRRsetPtr(), ConstRRsetPtr()),
EXPECT_THROW(updater_->add(ConstRRsetPtr(), ConstRRsetPtr()),
ZoneDataUpdater::NullRRset);
}
......@@ -88,9 +92,9 @@ getNode(isc::util::MemorySegment& mem_sgmt, const Name& name,
TEST_F(ZoneDataUpdaterTest, rrsigOnly) {
// RRSIG that doesn't have covered RRset can be added. The resulting
// rdataset won't have "normal" RDATA but sig RDATA.
updater_.add(ConstRRsetPtr(), textToRRset(
"www.example.org. 3600 IN RRSIG A 5 3 3600 20150420235959"
" 20051021000000 1 example.org. FAKE"));
updater_->add(ConstRRsetPtr(), textToRRset(
"www.example.org. 3600 IN RRSIG A 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
ZoneNode* node = getNode(mem_sgmt_, Name("www.example.org"), zone_data_);
const RdataSet* rdset = node->getData();
ASSERT_NE(static_cast<RdataSet*>(NULL), rdset);
......@@ -102,44 +106,44 @@ TEST_F(ZoneDataUpdaterTest, rrsigOnly) {
// The RRSIG covering A prohibits an actual A RRset from being added.
// This should be loosened in future version, but we check the current
// behavior.
EXPECT_THROW(updater_.add(
EXPECT_THROW(updater_->add(
textToRRset("www.example.org. 3600 IN A 192.0.2.1"),
ConstRRsetPtr()), ZoneDataUpdater::AddError);
// The special "wildcarding" node mark should be added for the RRSIG-only
// case, too.
updater_.add(ConstRRsetPtr(), textToRRset(
"*.wild.example.org. 3600 IN RRSIG A 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_->add(ConstRRsetPtr(), textToRRset(
"*.wild.example.org. 3600 IN RRSIG A 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
node = getNode(mem_sgmt_, Name("wild.example.org"), zone_data_);
EXPECT_TRUE(node->getFlag(ZoneData::WILDCARD_NODE));
// Simply adding RRSIG covering (delegating NS) shouldn't enable callback
// in search.
updater_.add(ConstRRsetPtr(), textToRRset(
"child.example.org. 3600 IN RRSIG NS 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_->add(ConstRRsetPtr(), textToRRset(
"child.example.org. 3600 IN RRSIG NS 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
node = getNode(mem_sgmt_, Name("child.example.org"), zone_data_);
EXPECT_FALSE(node->getFlag(ZoneNode::FLAG_CALLBACK));
// Same for DNAME
updater_.add(ConstRRsetPtr(), textToRRset(
"dname.example.org. 3600 IN RRSIG DNAME 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_->add(ConstRRsetPtr(), textToRRset(
"dname.example.org. 3600 IN RRSIG DNAME 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
node = getNode(mem_sgmt_, Name("dname.example.org"), zone_data_);
EXPECT_FALSE(node->getFlag(ZoneNode::FLAG_CALLBACK));
// Likewise, RRSIG for NSEC3PARAM alone shouldn't make the zone
// "NSEC3-signed".
updater_.add(ConstRRsetPtr(), textToRRset(
"example.org. 3600 IN RRSIG NSEC3PARAM 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_->add(ConstRRsetPtr(), textToRRset(
"example.org. 3600 IN RRSIG NSEC3PARAM 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
EXPECT_FALSE(zone_data_->isNSEC3Signed());
// And same for (RRSIG for) NSEC and "is signed".
updater_.add(ConstRRsetPtr(), textToRRset(
"example.org. 3600 IN RRSIG NSEC 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_->add(ConstRRsetPtr(), textToRRset(
"example.org. 3600 IN RRSIG NSEC 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
EXPECT_FALSE(zone_data_->isSigned());
}
......@@ -168,35 +172,35 @@ TEST_F(ZoneDataUpdaterTest, rrsigForNSEC3Only) {
// but that doesn't matter for this test.
// Add NSEC3PARAM, then RRSIG-only, which is okay.
updater_.add(textToRRset(
"example.org. 3600 IN NSEC3PARAM 1 0 12 AABBCCDD"),
textToRRset(
"example.org. 3600 IN RRSIG NSEC3PARAM 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_->add(textToRRset(
"example.org. 3600 IN NSEC3PARAM 1 0 12 AABBCCDD"),
textToRRset(
"example.org. 3600 IN RRSIG NSEC3PARAM 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
EXPECT_TRUE(zone_data_->isNSEC3Signed());
updater_.add(ConstRRsetPtr(),
textToRRset(
"09GM.example.org. 3600 IN RRSIG NSEC3 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_->add(ConstRRsetPtr(),
textToRRset(
"09GM.example.org. 3600 IN RRSIG NSEC3 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
checkNSEC3Rdata(mem_sgmt_, Name("09GM.example.org"), zone_data_);
// Clear the current content of zone, then add NSEC3
clearZoneData();
updater_.add(textToRRset(
"AABB.example.org. 3600 IN NSEC3 1 0 10 AA 00000000 A"),
textToRRset(
"AABB.example.org. 3600 IN RRSIG NSEC3 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_.add(ConstRRsetPtr(),
textToRRset(
"09GM.example.org. 3600 IN RRSIG NSEC3 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_->add(textToRRset(
"AABB.example.org. 3600 IN NSEC3 1 0 10 AA 00000000 A"),
textToRRset(
"AABB.example.org. 3600 IN RRSIG NSEC3 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
updater_->add(ConstRRsetPtr(),
textToRRset(
"09GM.example.org. 3600 IN RRSIG NSEC3 5 3 3600 "
"20150420235959 20051021000000 1 example.org. FAKE"));
checkNSEC3Rdata(mem_sgmt_, Name("09GM.example.org"), zone_data_);
// If we add only RRSIG without any NSEC3 related data beforehand,
// it will be rejected; it's a limitation of the current implementation.
clearZoneData();
EXPECT_THROW(updater_.add(
EXPECT_THROW(updater_->add(
ConstRRsetPtr(),
textToRRset(
"09GM.example.org. 3600 IN RRSIG NSEC3 5 3 3600 "
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment