This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 334708dc8c [fix](memory): avoid coredump when list pointer is null (#12919) 334708dc8c is described below commit 334708dc8c4faa288cc173c2aaea36367d3100c3 Author: 赵立伟 <zlw5...@163.com> AuthorDate: Tue Oct 11 16:00:23 2022 +0800 [fix](memory): avoid coredump when list pointer is null (#12919) --- be/src/runtime/free_pool.hpp | 13 ++++++-- be/test/CMakeLists.txt | 1 + be/test/runtime/free_pool_test.cpp | 67 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/be/src/runtime/free_pool.hpp b/be/src/runtime/free_pool.hpp index db23d98fc6..8cc5b0677d 100644 --- a/be/src/runtime/free_pool.hpp +++ b/be/src/runtime/free_pool.hpp @@ -25,6 +25,7 @@ #include <string> +#include "common/compiler_util.h" #include "common/logging.h" #include "runtime/mem_pool.h" #include "util/bit_util.h" @@ -128,9 +129,15 @@ public: #ifndef NDEBUG check_valid_allocation(list); #endif - // Add node to front of list. - node->next = list->next; - list->next = node; + if (UNLIKELY(nullptr == list)) { + // free memory directly if the pointer to free list is null + LOG(ERROR) << "The free list was released, and this may cause memory leak."; + free(ptr); + } else { + // Add node to front of list. + node->next = list->next; + list->next = node; + } } // Returns an allocation that is at least 'size'. If the current allocation diff --git a/be/test/CMakeLists.txt b/be/test/CMakeLists.txt index b33b0a0fee..88ddab1715 100644 --- a/be/test/CMakeLists.txt +++ b/be/test/CMakeLists.txt @@ -245,6 +245,7 @@ set(RUNTIME_TEST_FILES runtime/memory/system_allocator_test.cpp runtime/cache/partition_cache_test.cpp runtime/collection_value_test.cpp + runtime/free_pool_test.cpp #runtime/array_test.cpp ) set(TESTUTIL_TEST_FILES diff --git a/be/test/runtime/free_pool_test.cpp b/be/test/runtime/free_pool_test.cpp new file mode 100644 index 0000000000..5dc89be45b --- /dev/null +++ b/be/test/runtime/free_pool_test.cpp @@ -0,0 +1,67 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#include "runtime/free_pool.hpp" + +#include <gtest/gtest.h> + +#include <memory> + +namespace doris { + +class FreePoolTest : public testing::Test { +public: + FreePoolTest() {} + +protected: + virtual void SetUp() override { + memPool.reset(new MemPool()); + freePool.reset(new FreePool(memPool.get())); + } + virtual void TearDown() override { + memPool.reset(nullptr); + freePool.reset(nullptr); + } + +protected: + std::unique_ptr<MemPool> memPool; + std::unique_ptr<FreePool> freePool; +}; + +inline uint16_t getFreeListNodeCount(FreePool::FreeListNode* list) { + auto count = 0; + auto current = list; + while (nullptr != current) { + count++; + current = current->next; + } + return count; +} + +TEST_F(FreePoolTest, free) { + const int64_t size = 16; + auto ptr = freePool->allocate(size); + + auto node = reinterpret_cast<FreePool::FreeListNode*>(ptr - sizeof(FreePool::FreeListNode)); + auto list = node->list; + auto beforeCount = getFreeListNodeCount(list); + freePool->free(ptr); + auto afterCount = getFreeListNodeCount(list); + + ASSERT_EQ(beforeCount + 1, afterCount); +} +} // namespace doris --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org