Browse Source

[2097] use RdataReader::getSize() for deallocating the memory for RdataSet.

(this makes me realize we needed to pass RRClass to destroy().  so updated
the interface).
JINMEI Tatuya 12 years ago
parent
commit
ba9f685107

+ 11 - 2
src/lib/datasrc/memory/rdataset.cc

@@ -12,11 +12,13 @@
 // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 // PERFORMANCE OF THIS SOFTWARE.
 
+#include <dns/rrclass.h>
 #include <dns/rrtype.h>
 #include <dns/rrset.h>
 
 #include "rdataset.h"
 #include "rdata_encoder.h"
+#include "rdata_reader.h"
 
 #include <boost/static_assert.hpp>
 
@@ -54,9 +56,16 @@ RdataSet::create(util::MemorySegment& mem_sgmt, RdataEncoder& encoder,
 }
 
 void
-RdataSet::destroy(util::MemorySegment& mem_sgmt, RdataSet* rdataset) {
+RdataSet::destroy(util::MemorySegment& mem_sgmt, RRClass rrclass,
+                  RdataSet* rdataset)
+{
+    const size_t data_len =
+        RdataReader(rrclass, rdataset->type,
+                    reinterpret_cast<const uint8_t*>(rdataset + 1),
+                    rdataset->rdata_count,
+                    rdataset->sig_rdata_count).getSize();
     rdataset->~RdataSet();
-    mem_sgmt.deallocate(rdataset, sizeof(RdataSet) + 4);
+    mem_sgmt.deallocate(rdataset, sizeof(RdataSet) + data_len);
 }
 
 namespace {

+ 3 - 1
src/lib/datasrc/memory/rdataset.h

@@ -17,6 +17,7 @@
 
 #include <util/memory_segment.h>
 
+#include <dns/rrclass.h>
 #include <dns/rrtype.h>
 #include <dns/rrset.h>
 #include <dns/rrttl.h>
@@ -33,7 +34,8 @@ struct RdataSet {
                             RdataEncoder& encoder,
                             dns::ConstRRsetPtr rrset,
                             dns::ConstRRsetPtr sig_rrset);
-    static void destroy(util::MemorySegment& mem_sgmt, RdataSet* rdataset);
+    static void destroy(util::MemorySegment& mem_sgmt, dns::RRClass rrclass,
+                        RdataSet* rdataset);
 
     const dns::RRType type;
     const uint16_t sig_rdata_count : 3;

+ 8 - 1
src/lib/datasrc/memory/tests/rdataset_unittest.cc

@@ -16,6 +16,8 @@
 #include <util/memory_segment_local.h>
 
 #include <dns/rrset.h>
+#include <dns/rrclass.h>
+#include <dns/rrtype.h>
 #include <dns/rrttl.h>
 
 #include <datasrc/memory/rdata_encoder.h>
@@ -47,6 +49,8 @@ protected:
     RdataEncoder encoder_;
 };
 
+// Convert the given 32-bit integer (network byte order) to the corresponding
+// RRTTL object.
 RRTTL
 restoreTTL(uint32_t net_ttl) {
     isc::util::InputBuffer b(&net_ttl, sizeof(net_ttl));
@@ -54,12 +58,15 @@ restoreTTL(uint32_t net_ttl) {
 }
 
 TEST_F(RdataSetTest, create) {
+    // A simple case of creating an RdataSet.  Confirming the resulting
+    // fields have the expected values, and then destroying it (TearDown()
+    // would detect any memory leak)
     RdataSet* rdataset = RdataSet::create(mem_sgmt_, encoder_, a_rrset_,
                                           ConstRRsetPtr());
     EXPECT_EQ(RRType::A(), rdataset->type);
     EXPECT_EQ(RRTTL(1076895760), restoreTTL(rdataset->ttl));
     EXPECT_EQ(1, rdataset->rdata_count);
     EXPECT_EQ(0, rdataset->sig_rdata_count);
-    RdataSet::destroy(mem_sgmt_, rdataset);
+    RdataSet::destroy(mem_sgmt_, RRClass::IN(), rdataset);
 }
 }