kaijchen opened a new pull request, #46988:
URL: https://github.com/apache/doris/pull/46988

   ### What problem does this PR solve?
   
   Issue Number: DORIS-18080. Related PR: #xxx
   
   Problem Summary:
   
   Do not reset _arena, because it is still used in `~MemTable()` when 
releasing agg places
   
   Fix the following use-after-free
   
   Use:
   ```cpp
   ==3628099==ERROR: AddressSanitizer: heap-use-after-free on address 
0x52100381be60 at pc 0x5648f30893f8 bp 0x7f8842433310 sp 0x7f8842433308
   READ of size 8 at 0x52100381be60 thread T4767 (wg_flush_broker)
       #0 0x5648f30893f7 in 
phmap::priv::raw_hash_set<phmap::priv::FlatHashSetPolicy<unsigned long>, 
phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, 
std::allocator<unsigned long>>::destroy_slots() 
doris/thirdparty/installed/include/parallel_hashmap/phmap.h:1992:14
       #1 0x5648f30936f6 in 
phmap::priv::raw_hash_set<phmap::priv::FlatHashSetPolicy<unsigned long>, 
phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, 
std::allocator<unsigned long>>::~raw_hash_set() 
doris/thirdparty/installed/include/parallel_hashmap/phmap.h:1236:23
       #2 0x5648f3089276 in phmap::flat_hash_set<unsigned long, 
phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, 
std::allocator<unsigned long>>::~flat_hash_set() 
doris/thirdparty/installed/include/parallel_hashmap/phmap.h:4577:7
       #3 0x5648f308922a in doris::BitmapValue::~BitmapValue() 
doris/be/src/util/bitmap_value.h:824:7
       #4 0x56490d319fa6 in 
doris::vectorized::AggregateFunctionBitmapData<doris::vectorized::AggregateFunctionBitmapUnionOp>::~AggregateFunctionBitmapData()
 doris/be/src/vec/aggregate_functions/aggregate_function_bitmap.h:127:8
       #5 0x56490d49636a in 
doris::vectorized::IAggregateFunctionDataHelper<doris::vectorized::AggregateFunctionBitmapData<doris::vectorized::AggregateFunctionBitmapUnionOp>,
 
doris::vectorized::AggregateFunctionBitmapOp<doris::vectorized::AggregateFunctionBitmapUnionOp>>::destroy(char*)
 const doris/be/src/vec/aggregate_functions/aggregate_function.h:563:92
       #6 0x5648f68376e9 in doris::MemTable::~MemTable() 
doris/be/src/olap/memtable.cpp:159:27
   ```
   
   Free:
   ```cpp
   0x52100381be60 is located 352 bytes inside of 4096-byte region 
[0x52100381bd00,0x52100381cd00)
   freed by thread T4767 (wg_flush_broker) here:
       #0 0x5648f2f3ee46 in free (doris/output/be/lib/doris_be+0x57418e46) 
(BuildId: 298b9c91a1ec8fe0)
       #1 0x5648f3080dfc in DefaultMemoryAllocator::free(void*) 
doris/be/src/vec/common/allocator.h:108:41
       #2 0x5648f3080b3f in Allocator<false, false, false, 
DefaultMemoryAllocator>::free(void*, unsigned long) 
doris/be/src/vec/common/allocator.h:323:13
       #3 0x5648f30b6dee in doris::vectorized::Arena::Chunk::~Chunk() 
doris/be/src/vec/common/arena.h:77:31
       #4 0x5648f30b6d1f in doris::vectorized::Arena::~Arena() 
doris/be/src/vec/common/arena.h:151:16
       #5 0x5648f30b695a in 
std::default_delete<doris::vectorized::Arena>::operator()(doris::vectorized::Arena*)
 const 
env/ldb_toolchain/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/unique_ptr.h:99:2
       #6 0x5648f30b67c8 in std::__uniq_ptr_impl<doris::vectorized::Arena, 
std::default_delete<doris::vectorized::Arena>>::reset(doris::vectorized::Arena*)
 
env/ldb_toolchain/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/unique_ptr.h:211:4
       #7 0x5648f30b5d8c in std::unique_ptr<doris::vectorized::Arena, 
std::default_delete<doris::vectorized::Arena>>::reset(doris::vectorized::Arena*)
 
env/ldb_toolchain/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/unique_ptr.h:509:7
       #8 0x5648f684253b in 
doris::MemTable::_to_block(std::unique_ptr<doris::vectorized::Block, 
std::default_delete<doris::vectorized::Block>>*) 
doris/be/src/olap/memtable.cpp:522:12
       #9 0x5648f6842ac5 in 
doris::MemTable::to_block(std::unique_ptr<doris::vectorized::Block, 
std::default_delete<doris::vectorized::Block>>*) 
doris/be/src/olap/memtable.cpp:528:5
       #10 0x5648f6907a72 in 
doris::FlushToken::_do_flush_memtable(doris::MemTable*, int, long*) 
doris/be/src/olap/memtable_flush_executor.cpp:144:9
       #11 0x5648f690932c in 
doris::FlushToken::_flush_memtable(std::shared_ptr<doris::MemTable>, int, long) 
doris/be/src/olap/memtable_flush_executor.cpp:183:16
       #12 0x5648f6915d18 in doris::MemtableFlushTask::run() 
doris/be/src/olap/memtable_flush_executor.cpp:60:20
   
   ```
   
   ### Release note
   
   None
   
   ### Check List (For Author)
   
   - Test <!-- At least one of them must be included. -->
       - [ ] Regression test
       - [ ] Unit Test
       - [ ] Manual test (add detailed scripts or steps below)
       - [ ] No need to test or manual test. Explain why:
           - [ ] This is a refactor/code format and no logic has been changed.
           - [ ] Previous test can cover this change.
           - [ ] No code files have been changed.
           - [ ] Other reason <!-- Add your reason?  -->
   
   - Behavior changed:
       - [ ] No.
       - [ ] Yes. <!-- Explain the behavior change -->
   
   - Does this need documentation?
       - [ ] No.
       - [ ] Yes. <!-- Add document PR link here. eg: 
https://github.com/apache/doris-website/pull/1214 -->
   
   ### Check List (For Reviewer who merge this PR)
   
   - [ ] Confirm the release note
   - [ ] Confirm test cases
   - [ ] Confirm document
   - [ ] Add branch pick label <!-- Add branch pick label that this PR should 
merge into -->
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to