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>
This commit is contained in:
Patrick Luby 2024-04-03 17:34:49 -04:00 committed by Noel Grandin
parent 6b7245f512
commit cab028121b

View file

@ -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());
}