From c449473c205e4de8981259f9c99fcb40bbe333c5 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Tue, 10 Jun 2025 17:59:28 +0800 Subject: [PATCH] test/erasure-code: fix memory leak in ErasureCodePlugin.parity_delta_write Fix 4KB memory leak in ErasureCodePlugin_parity_delta_write_Test caused by unmanaged raw buffer allocation. The test was allocating a 4096-byte raw buffer to replace shard 4 for delta encoding validation, but the buffer::ptr constructed from the raw pointer did not manage the buffer's lifecycle. Detected by AddressSanitizer: ``` Direct leak of 4096 byte(s) in 1 object(s) allocated from: #0 0x7fb73a720e15 in malloc /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_malloc_linux.cpp:67 #1 0x5562f4062ccc in ErasureCodePlugin_parity_delta_write_Test::TestBody() /home/kefu/dev/ceph/src/test/erasure-code/TestErasureCodePluginJerasure.cc:122 #2 0x5562f41081a1 in void testing::internal::HandleSehExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) /home/kefu/dev/ceph/src/googletest/googletest/src/gtest.cc:2653 #3 0x5562f40f3004 in void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) /home/kefu/dev/ceph/src/googletest/googletest/src/gtest.cc:2689 #4 0x5562f409cbba in testing::Test::Run() /home/kefu/dev/ceph/src/googletest/googletest/src/gtest.cc:2728``` ``` In this change, we replace raw pointer allocation with create_bufferptr() to ensure proper memory management by buffer::ptr. Signed-off-by: Kefu Chai --- src/test/erasure-code/TestErasureCodePluginJerasure.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/erasure-code/TestErasureCodePluginJerasure.cc b/src/test/erasure-code/TestErasureCodePluginJerasure.cc index e53c55c15cc63..8292f4f76967d 100644 --- a/src/test/erasure-code/TestErasureCodePluginJerasure.cc +++ b/src/test/erasure-code/TestErasureCodePluginJerasure.cc @@ -118,8 +118,7 @@ TEST(ErasureCodePlugin, parity_delta_write) { ASSERT_EQ(*(uint32_t*)coding[s].c_str(), *(uint32_t*)coding2[s].c_str()); } - data.erase(shard_id_t(4)); - data.emplace(shard_id_t(4), (char*)malloc(4096), 4096); + data[shard_id_t(4)] = create_bufferptr(4096); shard_id_set want; want.insert_range(shard_id_t(0), 5); decode_in[shard_id_t(0)] = data[shard_id_t(0)]; -- 2.39.5