sw/source/core/ole/ndole.cxx | 68 +++++++++++-------------------------------- 1 file changed, 18 insertions(+), 50 deletions(-)
New commits: commit c72ceaebcfde7497db97eb105144bce6685e83f8 Author: Stephan Bergmann <stephan.bergm...@collabora.com> AuthorDate: Fri Aug 29 17:33:15 2025 +0200 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Sat Aug 30 17:27:22 2025 +0200 Revert part of "register caches with ImplSVData"... ...and of "use a different memory allocation strategy for caches" This reverts the sw/source/core/ole/ndole.cxx part of commit 3fc2216aa394222e7f3f4f0f4f78c5f198c694f5 and of commit b8935ee3b43e515b4a2810bb51a8bf17b90b7446 for now, as it causes > ==489880==ERROR: AddressSanitizer: heap-use-after-free on address 0x7c4dc7e22210 at pc 0x7b6d336739b2 bp 0x7ffc09ed2d50 sp 0x7ffc09ed2d48 > READ of size 8 at 0x7c4dc7e22210 thread T0 (kitbroker_003) > #0 in __gnu_cxx::__normal_iterator<SwOLEObj* const*, std::__cxx1998::vector<SwOLEObj*, std::pmr::polymorphic_allocator<SwOLEObj*>>>::__normal_iterator(SwOLEObj* const* const&) at /usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/stl_iterator.h:1059:20 > #1 in std::__cxx1998::vector<SwOLEObj*, std::pmr::polymorphic_allocator<SwOLEObj*>>::begin() const at /usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/stl_vector.h:1009:16 > #2 in std::__cxx1998::vector<SwOLEObj*, std::pmr::polymorphic_allocator<SwOLEObj*>>::empty() const at /usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/stl_vector.h:1224:16 > #3 in (anonymous namespace)::SwOLELRUCache::dropCaches() at core/sw/source/core/ole/ndole.cxx:98:29 > #4 in ImplSVData::dropCaches() at core/vcl/source/app/svdata.cxx:455:43 > #5 in vcl::lok::trimMemory(int) at core/vcl/source/app/svapp.cxx:1800:18 > #6 in lo_trimMemory(_LibreOfficeKit*, int) at core/desktop/source/lib/init.cxx:3403:5 > #7 in Document::trimAfterInactivity() at online/kit/Kit.cpp:1122:17 > #8 in KitSocketPoll::kitPoll(int) at online/kit/Kit.cpp:3045:20 > #9 in SvpSalInstance::ImplYield(bool, bool) at core/vcl/headless/svpinst.cxx:463:31 > #10 in SvpSalInstance::DoYield(bool, bool) at core/vcl/headless/svpinst.cxx:504:21 > #11 in ImplYield(bool, bool) at core/vcl/source/app/svapp.cxx:389:48 > #12 in Application::Yield() at core/vcl/source/app/svapp.cxx:492:5 > #13 in Application::Execute() at core/vcl/source/app/svapp.cxx:364:13 > #14 in desktop::Desktop::Main() at core/desktop/source/app/app.cxx:1680:13 > #15 in ImplSVMain() at core/vcl/source/app/svmain.cxx:228:35 > #16 in SVMain() at core/vcl/source/app/svmain.cxx:246:12 > #17 in soffice_main at core/desktop/source/app/sofficemain.cxx:121:12 > #18 in lo_runLoop(_LibreOfficeKit*, int (*)(void*, int), void (*)(void*), void*) at core/desktop/source/lib/init.cxx:7849:9 > #19 in lokit_main(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool, bool, bool, bool, bool, unsigned long) at online/kit/Kit.cpp:3928:16 > #20 in createLibreOfficeKit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool)::$_0::operator()() const at online/kit/ForKit.cpp:553:13 > #21 in void std::__invoke_impl<void, createLibreOfficeKit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool)::$_0&>(std::__invoke_other, createLibreOfficeKit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool)::$_0&) at /usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/invoke.h:63:14 > #22 in std::enable_if<is_invocable_r_v<void, createLibreOfficeKit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool)::$_0&>, void>::type std::__invoke_r<void, createLibreOfficeKit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool)::$_0&>(createLibreOfficeKit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string< char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool)::$_0&) at /usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/invoke.h:113:2 > #23 in std::_Function_handler<void (), createLibreOfficeKit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool)::$_0>::_M_invoke(std::_Any_data const&) at /usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/std_function.h:292:9 > #24 in std::function<void ()>::operator()() const at /usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/std_function.h:593:9 > #25 in forkKit(std::function<void ()> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::function<void (int)> const&) at online/kit/ForKit.cpp:496:9 > #26 in createLibreOfficeKit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, bool) at online/kit/ForKit.cpp:573:20 > #27 in forkLibreOfficeKit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool) at online/kit/ForKit.cpp:698:39 > #28 in forkit_main(int, char**) at online/kit/ForKit.cpp:1100:17 > #29 in __libc_start_call_main at <null> Change-Id: I8fdc88ca965e27c16b92df1c05e95eca23ab57b6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190379 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/sw/source/core/ole/ndole.cxx b/sw/source/core/ole/ndole.cxx index 6674cb1ab1a6..20cef31053a3 100644 --- a/sw/source/core/ole/ndole.cxx +++ b/sw/source/core/ole/ndole.cxx @@ -33,7 +33,6 @@ #include <sfx2/linkmgr.hxx> #include <unotools/configitem.hxx> #include <utility> -#include <vcl/dropcache.hxx> #include <vcl/outdev.hxx> #include <fmtanchr.hxx> #include <frmfmt.hxx> @@ -58,7 +57,7 @@ #include <svx/unopage.hxx> #include <comphelper/threadpool.hxx> #include <atomic> -#include <vector> +#include <deque> #include <libxml/xmlwriter.h> #include <osl/diagnose.h> #include <flyfrm.hxx> @@ -71,39 +70,14 @@ namespace { class SwOLELRUCache : private utl::ConfigItem - , public CacheOwner { private: -#if defined __cpp_lib_memory_resource - typedef std::pmr::vector<SwOLEObj*> vector_t; -#else - typedef std::vector<SwOLEObj*> vector_t; -#endif - vector_t m_OleObjects; + std::deque<SwOLEObj *> m_OleObjects; sal_Int32 m_nLRU_InitSize; static uno::Sequence< OUString > GetPropertyNames(); virtual void ImplCommit() override; - void tryShrinkCacheTo(sal_Int32 nVal); - - virtual OUString getCacheName() const override - { - return "SwOLELRUCache"; - } - - virtual bool dropCaches() override - { - tryShrinkCacheTo(0); - return m_OleObjects.empty(); - } - - virtual void dumpState(rtl::OStringBuffer& rState) override - { - rState.append(" SwOLELRUCache: "); - rState.append(static_cast<sal_Int32>(m_OleObjects.size())); - } - public: SwOLELRUCache(); @@ -1310,9 +1284,6 @@ void SwOLEObj::dumpAsXml(xmlTextWriterPtr pWriter) const SwOLELRUCache::SwOLELRUCache() : utl::ConfigItem(u"Office.Common/Cache"_ustr) -#if defined __cpp_lib_memory_resource - , m_OleObjects(&GetMemoryResource()) -#endif , m_nLRU_InitSize( 20 ) { EnableNotification( GetPropertyNames() ); @@ -1334,23 +1305,6 @@ void SwOLELRUCache::ImplCommit() { } -void SwOLELRUCache::tryShrinkCacheTo(sal_Int32 nVal) -{ - // size of cache has been changed - sal_Int32 nCount = m_OleObjects.size(); - sal_Int32 nPos = nCount; - - // try to remove the last entries until new maximum size is reached - while( nCount > nVal ) - { - SwOLEObj *const pObj = m_OleObjects[ --nPos ]; - if ( pObj->UnloadObject() ) - nCount--; - if ( !nPos ) - break; - } -} - void SwOLELRUCache::Load() { Sequence< OUString > aNames( GetPropertyNames() ); @@ -1362,11 +1316,25 @@ void SwOLELRUCache::Load() sal_Int32 nVal = 0; *pValues >>= nVal; + if (nVal < m_nLRU_InitSize) { std::shared_ptr<SwOLELRUCache> xKeepAlive(g_pOLELRU_Cache); // prevent delete this - tryShrinkCacheTo(nVal); + // size of cache has been changed + sal_Int32 nCount = m_OleObjects.size(); + sal_Int32 nPos = nCount; + + // try to remove the last entries until new maximum size is reached + while( nCount > nVal ) + { + SwOLEObj *const pObj = m_OleObjects[ --nPos ]; + if ( pObj->UnloadObject() ) + nCount--; + if ( !nPos ) + break; + } } + m_nLRU_InitSize = nVal; } @@ -1392,7 +1360,7 @@ void SwOLELRUCache::InsertObj( SwOLEObj& rObj ) if ( pObj->UnloadObject() ) nCount--; } - m_OleObjects.insert(m_OleObjects.begin(), &rObj); + m_OleObjects.push_front(&rObj); } void SwOLELRUCache::RemoveObj( SwOLEObj& rObj )