diff --git a/src/coarse/coarse.c b/src/coarse/coarse.c index 956e54857e..19798466e1 100644 --- a/src/coarse/coarse.c +++ b/src/coarse/coarse.c @@ -1170,10 +1170,13 @@ umf_result_t coarse_free(coarse_t *coarse, void *ptr, size_t bytes) { } block_t *block = get_node_block(node); - assert(block->used); + if (!block->used) { + LOG_ERR("double free"); + utils_mutex_unlock(&coarse->lock); + return UMF_RESULT_ERROR_INVALID_ARGUMENT; + } if (bytes > 0 && bytes != block->size) { - // wrong size of allocation LOG_ERR("wrong size of allocation"); utils_mutex_unlock(&coarse->lock); return UMF_RESULT_ERROR_INVALID_ARGUMENT; diff --git a/test/coarse_lib.cpp b/test/coarse_lib.cpp index a1aec224ae..c2e1f9c856 100644 --- a/test/coarse_lib.cpp +++ b/test/coarse_lib.cpp @@ -160,6 +160,13 @@ TEST_P(CoarseWithMemoryStrategyTest, coarseTest_basic_provider) { ASSERT_EQ(coarse_get_stats(ch).alloc_size, alloc_size); ASSERT_EQ(coarse_get_stats(ch).num_all_blocks, 1); + // test double free + umf_result = coarse_free(ch, ptr, 2 * MB); + ASSERT_EQ(umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT); + ASSERT_EQ(coarse_get_stats(ch).used_size, 0); + ASSERT_EQ(coarse_get_stats(ch).alloc_size, alloc_size); + ASSERT_EQ(coarse_get_stats(ch).num_all_blocks, 1); + coarse_delete(ch); umfMemoryProviderDestroy(malloc_memory_provider); } @@ -202,6 +209,13 @@ TEST_P(CoarseWithMemoryStrategyTest, coarseTest_basic_fixed_memory) { ASSERT_EQ(coarse_get_stats(ch).alloc_size, buff_size); ASSERT_EQ(coarse_get_stats(ch).num_all_blocks, 1); + // test double free + umf_result = coarse_free(ch, ptr, 2 * MB); + ASSERT_EQ(umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT); + ASSERT_EQ(coarse_get_stats(ch).used_size, 0); + ASSERT_EQ(coarse_get_stats(ch).alloc_size, buff_size); + ASSERT_EQ(coarse_get_stats(ch).num_all_blocks, 1); + coarse_delete(ch); }