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>
(cherry picked from commit cab028121bd9b620529b6492b3247ac48ac2082b)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165832
Reviewed-by: Patrick Luby <guibomacdev@gmail.com>
diff --git a/desktop/source/deployment/registry/package/dp_package.cxx b/desktop/source/deployment/registry/package/dp_package.cxx
index 0eb0232..6bd8b02 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());
        }