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 )

Reply via email to