From: Mukund Sivaraman Date: Thu, 12 Jul 2012 08:15:49 +0000 (+0530) Subject: [2088] Handle NULL deallocate as a nop X-Git-Tag: trac2351_base~188^2^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=25cc38bbd45cca618c0f073b743882865ebc1d64;p=thirdparty%2Fkea.git [2088] Handle NULL deallocate as a nop --- diff --git a/src/lib/util/memory_segment_local.cc b/src/lib/util/memory_segment_local.cc index 468c499270..9c345c9040 100644 --- a/src/lib/util/memory_segment_local.cc +++ b/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_); diff --git a/src/lib/util/tests/memory_segment_local_unittest.cc b/src/lib/util/tests/memory_segment_local_unittest.cc index e8ee1104d6..08787ad1e0 100644 --- a/src/lib/util/tests/memory_segment_local_unittest.cc +++ b/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 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