summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2012-10-26 16:14:06 +0200
committerStephan Bergmann <sbergman@redhat.com>2012-10-26 16:21:10 +0200
commitc9a27eb938b98d7812d3ab965fc88bb511e0b996 (patch)
treed4665923a2972ffbfc0c371b69d95ffa6e491de6 /desktop
parent89e875b50a275512c5732557c1d09d1e1f1cbfe9 (diff)
Work around premature disposing of PackageRegistryBackends
With ucbhelper::Content now requiring an XComponentContext during construction, calling "unopkg add" with an .oxt that requires license acceptance would lead to an assertion about a null XComponentContext, as doChecksForAddExtension calls the XPackage's checkPrerequisites -> checkLicnese -> getTextFromURL, which creates an ucbhelper::Content with getMyBackend()->getComponentContext(), but early release of the "tmp" manager would already have caused disposing of that backend, which clears m_xComponentContext. I assume this problem had always been lurking silently in the code. Change-Id: I9f59c612fe3831b2f6dd832ef2f0505b6590b8e0
Diffstat (limited to 'desktop')
-rw-r--r--desktop/source/deployment/manager/dp_extensionmanager.cxx37
-rw-r--r--desktop/source/deployment/manager/dp_extensionmanager.hxx5
2 files changed, 16 insertions, 26 deletions
diff --git a/desktop/source/deployment/manager/dp_extensionmanager.cxx b/desktop/source/deployment/manager/dp_extensionmanager.cxx
index de78275bb205..4ba55848494d 100644
--- a/desktop/source/deployment/manager/dp_extensionmanager.cxx
+++ b/desktop/source/deployment/manager/dp_extensionmanager.cxx
@@ -655,8 +655,22 @@ Reference<deploy::XPackage> ExtensionManager::addExtension(
//would remove the first one.
::osl::MutexGuard addGuard(m_addMutex);
- Reference<deploy::XPackage> xTmpExtension =
- getTempExtension(url, xAbortChannel, xCmdEnv);
+ Reference<deploy::XPackageManager> xTmpRepository(getTmpRepository());
+ // make sure xTmpRepository is alive as long as xTmpExtension is; as
+ // the "tmp" manager is only held weakly by m_xPackageManagerFactory, it
+ // could otherwise be disposed early, which would in turn dispose
+ // xTmpExtension's PackageRegistryBackend behind its back
+ Reference<deploy::XPackage> xTmpExtension(
+ xTmpRepository->addPackage(
+ url, uno::Sequence<beans::NamedValue>(), OUString(), xAbortChannel,
+ new TmpRepositoryCommandEnv()));
+ if (!xTmpExtension.is()) {
+ throw deploy::DeploymentException(
+ ("Extension Manager: Failed to create temporary XPackage for url: "
+ + url),
+ static_cast<OWeakObject*>(this), uno::Any());
+ }
+
//Make sure the extension is removed from the tmp repository in case
//of an exception
ExtensionRemoveGuard tmpExtensionRemoveGuard(xTmpExtension, getTmpRepository());
@@ -1404,25 +1418,6 @@ void ExtensionManager::checkUpdate(
static_cast<OWeakObject *>(this), request );
}
-Reference<deploy::XPackage> ExtensionManager::getTempExtension(
- OUString const & url,
- Reference<task::XAbortChannel> const & xAbortChannel,
- Reference<ucb::XCommandEnvironment> const & /*xCmdEnv*/)
-
-{
- Reference<ucb::XCommandEnvironment> tmpCmdEnvA(new TmpRepositoryCommandEnv());
- Reference<deploy::XPackage> xTmpPackage = getTmpRepository()->addPackage(
- url, uno::Sequence<beans::NamedValue>(),OUString(), xAbortChannel, tmpCmdEnvA);
- if (!xTmpPackage.is())
- {
- throw deploy::DeploymentException(
- OUSTR("Extension Manager: Failed to create temporary XPackage for url: ") + url,
- static_cast<OWeakObject*>(this), uno::Any());
-
- }
- return xTmpPackage;
-}
-
uno::Sequence<Reference<deploy::XPackage> > SAL_CALL
ExtensionManager::getExtensionsWithUnacceptedLicenses(
OUString const & repository,
diff --git a/desktop/source/deployment/manager/dp_extensionmanager.hxx b/desktop/source/deployment/manager/dp_extensionmanager.hxx
index c8d8b300da60..584f01ce07c1 100644
--- a/desktop/source/deployment/manager/dp_extensionmanager.hxx
+++ b/desktop/source/deployment/manager/dp_extensionmanager.hxx
@@ -280,11 +280,6 @@ private:
css::uno::Reference<css::deployment::XPackage> const & oldExtension,
css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv);
- css::uno::Reference<css::deployment::XPackage> getTempExtension(
- ::rtl::OUString const & url,
- css::uno::Reference<css::task::XAbortChannel> const & xAbortChannel,
- css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv);
-
void addExtensionsToMap(
id2extensions & mapExt,
css::uno::Sequence<css::uno::Reference<css::deployment::XPackage> > const & seqExt,