diff options
author | Patrick Luby <guibmacdev@gmail.com> | 2024-04-03 17:34:49 -0400 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2024-04-04 08:01:19 +0200 |
commit | cab028121bd9b620529b6492b3247ac48ac2082b (patch) | |
tree | bbe2e56aab2ee086b78a512a974e6f779dd81c20 | |
parent | 6b7245f51274424a6c634424161e8766f8827033 (diff) |
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.grandin@collabora.co.uk>
-rw-r--r-- | desktop/source/deployment/registry/package/dp_package.cxx | 17 |
1 files changed, 16 insertions, 1 deletions
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()); } |