desktop/source/deployment/registry/package/dp_package.cxx | 17 +++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
New commits: commit 47ca58be2941e67c9304cf47d4beba93bdf74ffc Author: Patrick Luby <guibmac...@gmail.com> AuthorDate: Wed Apr 3 17:34:49 2024 -0400 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Sun Apr 7 20:12:16 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> (cherry picked from commit cab028121bd9b620529b6492b3247ac48ac2082b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165832 Reviewed-by: Patrick Luby <guibomac...@gmail.com> diff --git a/desktop/source/deployment/registry/package/dp_package.cxx b/desktop/source/deployment/registry/package/dp_package.cxx index 0eb02321a74f..6bd8b02bc7d7 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()); }