From: JINMEI Tatuya Date: Tue, 12 Feb 2013 04:38:09 +0000 (-0800) Subject: [2440] ignore duplicate RRSIG Rdata, too. X-Git-Tag: bind10-1.1.0beta1-release~70^2~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=016d4a4bcb6c23de3107df178a71f75e46dbdba0;p=thirdparty%2Fkea.git [2440] ignore duplicate RRSIG Rdata, too. --- diff --git a/src/lib/datasrc/memory/rdata_serialization.cc b/src/lib/datasrc/memory/rdata_serialization.cc index ee7a241468..e2400bf196 100644 --- a/src/lib/datasrc/memory/rdata_serialization.cc +++ b/src/lib/datasrc/memory/rdata_serialization.cc @@ -375,6 +375,7 @@ private: } // end of unnamed namespace namespace { +// A trivial comparison function used for std::set below. bool RdataLess(const ConstRdataPtr& rdata1, const ConstRdataPtr& rdata2) { return (rdata1->compare(*rdata2) < 0); @@ -395,6 +396,8 @@ struct RdataEncoder::RdataEncoderImpl { boost::optional current_class_; boost::optional current_type_; + // Temporary storage of Rdata and RRSIGs to be encoded. They are used + // to detect and ignore duplicate data. typedef boost::function RdataCmp; // added unique Rdatas @@ -454,6 +457,14 @@ RdataEncoder::addSIGRdata(const Rdata& sig_rdata) { isc_throw(InvalidOperation, "RdataEncoder::addSIGRdata performed before start"); } + + // Ignore duplicate RRSIGs + ConstRdataPtr rdatap = createRdata(RRType::RRSIG(), *impl_->current_class_, + sig_rdata); + if (impl_->rrsigs_.find(rdatap) != impl_->rrsigs_.end()) { + return; + } + const size_t cur_pos = impl_->rrsig_buffer_.getLength(); sig_rdata.toWire(impl_->rrsig_buffer_); const size_t rrsig_datalen = impl_->rrsig_buffer_.getLength() - cur_pos; @@ -461,6 +472,7 @@ RdataEncoder::addSIGRdata(const Rdata& sig_rdata) { isc_throw(RdataEncodingError, "RRSIG is too large: " << rrsig_datalen << " bytes"); } + impl_->rrsigs_.insert(rdatap); impl_->rrsig_lengths_.push_back(rrsig_datalen); } diff --git a/src/lib/datasrc/tests/memory/rdata_serialization_unittest.cc b/src/lib/datasrc/tests/memory/rdata_serialization_unittest.cc index 9f47249e53..05a734e4ad 100644 --- a/src/lib/datasrc/tests/memory/rdata_serialization_unittest.cc +++ b/src/lib/datasrc/tests/memory/rdata_serialization_unittest.cc @@ -746,6 +746,10 @@ TYPED_TEST(RdataEncodeDecodeTest, addRdataMulti) { "A 5 2 3600 20120814220826 " "20120715220826 54321 com. FAKE")); this->addRdataMultiCommon(rrsigs); + + // Similar to the previous, but with duplicate RRSIG. + rrsigs.push_back(this->rrsig_rdata_); + this->addRdataMultiCommon(rrsigs, true); } TEST_F(RdataSerializationTest, badAddRdata) {