Browse Source

[2088] Handle NULL deallocate as a nop

Mukund Sivaraman 12 years ago
parent
commit
25cc38bbd4

+ 6 - 0
src/lib/util/memory_segment_local.cc

@@ -31,6 +31,12 @@ MemorySegmentLocal::allocate(size_t size) {
 
 void
 MemorySegmentLocal::deallocate(void* ptr, size_t size) {
+    if (ptr == NULL) {
+        // Return early if NULL is passed to be deallocated (without
+        // modifying allocated_size, or comparing against it).
+        return;
+    }
+
     if (size > allocated_size_) {
       isc_throw(OutOfRange, "Invalid size to deallocate: " << size
                 << "; currently allocated size: " << allocated_size_);

+ 13 - 0
src/lib/util/tests/memory_segment_local_unittest.cc

@@ -86,4 +86,17 @@ TEST(MemorySegmentLocal, TestBadDeallocate) {
     EXPECT_THROW(segment->deallocate(ptr, 2048), isc::OutOfRange);
 }
 
+TEST(MemorySegmentLocal, TestNullDeallocate) {
+    auto_ptr<MemorySegment> segment(new MemorySegmentLocal());
+
+    // By default, nothing is allocated.
+    EXPECT_TRUE(segment->allMemoryDeallocated());
+
+    // NULL deallocation is a no-op.
+    EXPECT_NO_THROW(segment->deallocate(NULL, 1024));
+
+    // This should still return true.
+    EXPECT_TRUE(segment->allMemoryDeallocated());
+}
+
 } // anonymous namespace