Parcourir la source

[2440] check RR type consistency in merge mode RdataSet::create.

JINMEI Tatuya il y a 12 ans
Parent
commit
769575c46f

+ 4 - 1
src/lib/datasrc/memory/rdataset.cc

@@ -55,7 +55,7 @@ RdataSet::create(util::MemorySegment& mem_sgmt, RdataEncoder& encoder,
                  const RdataSet* old_rdataset, ConstRRsetPtr rrset,
                  ConstRRsetPtr sig_rrset)
 {
-    // TODO: consistency check and taking min
+    // TODO: taking min TTL
     // Check basic validity
     if (!rrset && !sig_rrset) {
         isc_throw(BadValue, "Both RRset and RRSIG are NULL");
@@ -73,6 +73,9 @@ RdataSet::create(util::MemorySegment& mem_sgmt, RdataEncoder& encoder,
     const RRClass rrclass = rrset ? rrset->getClass() : sig_rrset->getClass();
     const RRType rrtype = rrset ? rrset->getType() :
         getCoveredType(sig_rrset->getRdataIterator()->getCurrent());
+    if (old_rdataset && old_rdataset->type != rrtype) {
+        isc_throw(BadValue, "RR type doesn't match for merging RdataSet");
+    }
     const RRTTL rrttl = rrset ? rrset->getTTL() : sig_rrset->getTTL();
     if (old_rdataset) {
         encoder.start(rrclass, rrtype, old_rdataset->getDataBuf(),

+ 12 - 3
src/lib/datasrc/tests/memory/rdataset_unittest.cc

@@ -559,13 +559,22 @@ TEST_F(RdataSetTest, badCreate) {
 }
 
 TEST_F(RdataSetTest, badMergeCreate) {
-    // The 'old RdataSet' for merge.  Its content doesn't matter; the test
-    // should trigger exception before examining it.
+    // The 'old RdataSet' for merge.  Its content doesn't matter much; the test
+    // should trigger exception before examining it except for the last checks.
     SegmentObjectHolder<RdataSet, RRClass> holder(
         mem_sgmt_,
-        RdataSet::create(mem_sgmt_, encoder_, a_rrset_, ConstRRsetPtr()),
+        RdataSet::create(mem_sgmt_, encoder_,
+                         textToRRset("www.example.com. 0 IN AAAA 2001:db8::1"),
+                         ConstRRsetPtr()),
         RRClass::IN());
 
     checkBadCreate(boost::bind(createWrapper, _1, _2, holder.get(), _3, _4));
+
+    // Type mismatch: this case is specific to the merge create.
+    EXPECT_THROW(RdataSet::create(mem_sgmt_, encoder_, *holder.get(), a_rrset_,
+                                  ConstRRsetPtr()), isc::BadValue);
+    EXPECT_THROW(RdataSet::create(mem_sgmt_, encoder_, *holder.get(),
+                                  ConstRRsetPtr(), rrsig_rrset_),
+                 isc::BadValue);
 }
 }