From f1b8b27fd18652a12f79223030f2066e211c7b4d Mon Sep 17 00:00:00 2001 From: Miguel Company Date: Tue, 11 Aug 2026 10:19:35 +0200 Subject: [PATCH] Improvements on rbtree_best_fit::check_sanity. Perform quick tests before iterating on the blocks. Early exit from loop if block size is 0 or accumulated free memory exceeds maximum. Signed-off-by: Miguel Company --- .../interprocess/mem_algo/rbtree_best_fit.hpp | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/include/boost/interprocess/mem_algo/rbtree_best_fit.hpp b/include/boost/interprocess/mem_algo/rbtree_best_fit.hpp index f217aa60..ac9c4dae 100644 --- a/include/boost/interprocess/mem_algo/rbtree_best_fit.hpp +++ b/include/boost/interprocess/mem_algo/rbtree_best_fit.hpp @@ -651,29 +651,35 @@ bool rbtree_best_fit:: //----------------------- boost::interprocess::scoped_lock guard(m_header); //----------------------- - imultiset_iterator ib(m_header.m_imultiset.begin()), ie(m_header.m_imultiset.end()); - - size_type free_memory = 0; - - //Iterate through all blocks obtaining their size - for(; ib != ie; ++ib){ - free_memory += (size_type)ib->m_size*Alignment; - if(!algo_impl_t::check_alignment(&*ib)) - return false; - } //Check allocated bytes are less than size if(m_header.m_allocated > m_header.m_size){ return false; } + //Calculate the maximum free memory available in the segment size_type block1_off = priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); + size_type max_free_memory = m_header.m_size - block1_off; - //Check free bytes are less than size - if(free_memory > (m_header.m_size - block1_off)){ - return false; + //Iterate through all blocks obtaining their size + imultiset_iterator ib(m_header.m_imultiset.begin()), ie(m_header.m_imultiset.end()); + size_type free_memory = 0; + for(; ib != ie; ++ib){ + if(!algo_impl_t::check_alignment(&*ib)){ + return false; + } + //A size of 0 is not allowed in the multiset + if(!ib->m_size){ + return false; + } + free_memory += (size_type)ib->m_size*Alignment; + //Check free bytes are less than size + if(free_memory > max_free_memory){ + return false; + } } + return true; }