desktop/source/deployment/registry/package/dp_package.cxx |   17 +++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

New commits:
commit cab028121bd9b620529b6492b3247ac48ac2082b
Author:     Patrick Luby <guibmac...@gmail.com>
AuthorDate: Wed Apr 3 17:34:49 2024 -0400
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu Apr 4 08:01:19 2024 +0200

    tdf#159790 temporarily release mutex for child packages
    
    This code is normally run on a separate thread so if a
    child package tries to acquire the solar mutex, a deadlock
    can occur if the main thread calls isRegistered() on this
    package or any of its parents. So, temporarily release
    this package's mutex while registering the child package.
    
    Change-Id: I45b534c44d5946637a5441927ed01a68aad4c448
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165766
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/desktop/source/deployment/registry/package/dp_package.cxx 
b/desktop/source/deployment/registry/package/dp_package.cxx
index 6af2fb5515f5..d5c1feeb4992 100644
--- a/desktop/source/deployment/registry/package/dp_package.cxx
+++ b/desktop/source/deployment/registry/package/dp_package.cxx
@@ -781,7 +781,7 @@ uno::Reference< graphic::XGraphic > 
BackendImpl::PackageImpl::getIcon( sal_Bool
 
 
 void BackendImpl::PackageImpl::processPackage_(
-    ::osl::ResettableMutexGuard &,
+    ::osl::ResettableMutexGuard & guard,
     bool doRegisterPackage,
     bool startup,
     ::rtl::Reference<AbortChannel> const & abortChannel,
@@ -802,10 +802,20 @@ void BackendImpl::PackageImpl::processPackage_(
                 xPackage->createAbortChannel() );
             AbortChannel::Chain chain( abortChannel, xSubAbortChannel );
             try {
+                // tdf#159790 temporarily release mutex for child packages
+                // This code is normally run on a separate thread so if a
+                // child package tries to acquire the solar mutex, a deadlock
+                // can occur if the main thread calls isRegistered() on this
+                // package or any of its parents. So, temporarily release
+                // this package's mutex while registering the child package.
+                guard.clear();
                 xPackage->registerPackage( startup, xSubAbortChannel, xCmdEnv 
);
+                guard.reset();
             }
             catch (const Exception &)
             {
+                guard.reset();
+
                //We even try a rollback if the user cancelled the action 
(CommandAbortedException)
                 //in order to prevent invalid database entries.
                 Any exc( ::cppu::getCaughtException() );
@@ -856,6 +866,11 @@ void BackendImpl::PackageImpl::processPackage_(
                     ::cppu::throwException(exc);
                 }
             }
+            catch (...) {
+                guard.reset();
+                throw;
+            }
+
             data.items.emplace_back(xPackage->getURL(),
                                  xPackage->getPackageType()->getMediaType());
         }

Reply via email to