sal/cppunittester/cppunittester.cxx |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

New commits:
commit 43d08f386117cbeeee1de1fe2ba8248554c1aef1
Author:     Stephan Bergmann <sberg...@redhat.com>
AuthorDate: Mon Sep 21 14:03:14 2020 +0200
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Mon Sep 21 15:26:05 2020 +0200

    cppunittester: Do not unload test libraries
    
    At least on Windows, e6dfaf9f44f9939abc338c83b3024108431d0f69 "Turn
    OUStringLiteral into a consteval'ed, static-refcound rtl_uString" caused
    CppunitTest_sc_tablesheetsobj to fail at exit, when the
    
      static OUString aCacheName
    
    in ScDocument::GetTable (sc/source/core/data/document.cxx) is destroyed but
    references
    
      constexpr OUStringLiteral gaSrcSheetName(u"SheetToCopy")
    
    from test/source/sheet/xspreadsheets2.cxx in Library_subsequenttest, 
referenced
    (only) by the CppunitTest_sc_tablesheetsobj library, and both those 
libraries
    had already been unloaded from memory.
    
    Change-Id: Icea85019611fbaec3603f37b234e9e6fe3502961
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103103
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sberg...@redhat.com>

diff --git a/sal/cppunittester/cppunittester.cxx 
b/sal/cppunittester/cppunittester.cxx
index a760ecf8ff41..0a833de5fba2 100644
--- a/sal/cppunittester/cppunittester.cxx
+++ b/sal/cppunittester/cppunittester.cxx
@@ -254,9 +254,14 @@ public:
         // call the initialize methods of the CppUnitTestPlugIns that
         // we statically link to the app executable.
 #else
-        CppUnit::PlugInManager manager;
+        // The PlugInManager instance is deliberately leaked, so that the 
dynamic libraries it loads
+        // are never unloaded (which could make e.g. pointers from other 
libraries' static data
+        // structures to const data in those libraries, like some static 
OUString cache pointing at
+        // a const OUStringLiteral, become dangling by the time those static 
data structures are
+        // destroyed during exit):
+        auto manager = new CppUnit::PlugInManager;
         try {
-            manager.load(testlib, args);
+            manager->load(testlib, args);
         } catch (const CppUnit::DynamicLibraryManagerException &e) {
             std::cerr << "DynamicLibraryManagerException: \"" << e.what() << 
"\"\n";
 #ifdef _WIN32
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to