[libreoffice] Resolves: rhbz#649310 don't crash deregistering diff. platform ext.

David Tardon dtardon at fedoraproject.org
Thu Feb 10 14:14:06 UTC 2011


commit 4090557bb6e2c491aaa07b1ee37dce5914fd6f29
Author: David Tardon <dtardon at redhat.com>
Date:   Thu Feb 10 15:11:50 2011 +0100

    Resolves: rhbz#649310 don't crash deregistering diff. platform ext.

 ...-don-t-crash-deregistering-diff.-platform.patch |  210 ++++++++++++++++++++
 libreoffice.spec                                   |    4 +
 2 files changed, 214 insertions(+), 0 deletions(-)
---
diff --git a/0001-rhbz-649310-don-t-crash-deregistering-diff.-platform.patch b/0001-rhbz-649310-don-t-crash-deregistering-diff.-platform.patch
new file mode 100644
index 0000000..b070c08
--- /dev/null
+++ b/0001-rhbz-649310-don-t-crash-deregistering-diff.-platform.patch
@@ -0,0 +1,210 @@
+From d7cc1b57990e1ebc2e1f2a4380dd8e66b0eff158 Mon Sep 17 00:00:00 2001
+From: David Tardon <dtardon at redhat.com>
+Date: Thu, 10 Feb 2011 13:54:19 +0100
+Subject: [PATCH] rhbz#649310 don't crash deregistering diff. platform ext.
+
+This happens, for example, if one switches between, lets say, x86 and
+x86_64 systems and has the same /home mounted from both. Then
+platform-dependent extensions from one system does not exist on the
+other one, but must still be deregistered correctly.
+---
+ .../deployment/registry/component/dp_component.cxx |  164 +++++++++++++++++++-
+ 1 files changed, 159 insertions(+), 5 deletions(-)
+
+diff --git a/desktop/source/deployment/registry/component/dp_component.cxx b/desktop/source/deployment/registry/component/dp_component.cxx
+index b7fe0b1..d4cb5dd 100644
+--- a/desktop/source/deployment/registry/component/dp_component.cxx
++++ b/desktop/source/deployment/registry/component/dp_component.cxx
+@@ -192,6 +192,42 @@ class BackendImpl : public ::dp_registry::backend::PackageRegistryBackend
+             OUString const & identifier);
+     };
+     friend class TypelibraryPackageImpl;
++
++    /** Serves for unregistering packages that were registered on a
++        different platform. This can happen if one has remotely mounted
++        /home, for example.
++     */
++    class OtherPlatformPackageImpl : public ::dp_registry::backend::Package
++    {
++    public:
++        OtherPlatformPackageImpl(
++            ::rtl::Reference<PackageRegistryBackend> const & myBackend,
++            OUString const & url, OUString const & name,
++            Reference<deployment::XPackageTypeInfo> const & xPackageType,
++            bool bRemoved, OUString const & identifier, OUString const& rPlatform);
++
++    private:
++        BackendImpl * getMyBackend() const;
++
++        const Reference<registry::XSimpleRegistry> impl_openRDB() const;
++        const Reference<XInterface> impl_createInstance(OUString const& rService) const;
++
++        // Package
++        virtual beans::Optional< beans::Ambiguous<sal_Bool> > isRegistered_(
++            ::osl::ResettableMutexGuard & guard,
++            ::rtl::Reference<AbortChannel> const & abortChannel,
++            Reference<XCommandEnvironment> const & xCmdEnv );
++        virtual void processPackage_(
++            ::osl::ResettableMutexGuard & guard,
++            bool registerPackage,
++            bool startup,
++            ::rtl::Reference<AbortChannel> const & abortChannel,
++            Reference<XCommandEnvironment> const & xCmdEnv );
++
++    private:
++        OUString const m_aPlatform;
++    };
++    friend class OtherPlatformPackageImpl;
+     
+     t_stringlist m_jar_typelibs;
+     t_stringlist m_rdb_typelibs;
+@@ -694,16 +730,30 @@ Reference<deployment::XPackage> BackendImpl::bindPackage_(
+                 
+                 INetContentTypeParameter const * param = params.find(
+                     ByteString("platform") );
+-                if (param == 0 || platform_fits( param->m_sValue )) {
++                bool bPlatformFits(param == 0);
++                String aPlatform;
++                if (!bPlatformFits) // platform is specified, we have to check
++                {
++                    aPlatform = param->m_sValue;
++                    bPlatformFits = platform_fits(aPlatform);
++                }
++                // If the package is being removed, do not care whether
++                // platform fits. We won't be using it anyway.
++                if (bPlatformFits || bRemoved) {
+                     param = params.find( ByteString("type") );
+                     if (param != 0)
+                     {
+                         String const & value = param->m_sValue;
+                         if (value.EqualsIgnoreCaseAscii("native")) {
+-                            return new BackendImpl::ComponentPackageImpl(
+-                                this, url, name, m_xDynComponentTypeInfo,
+-                                OUSTR("com.sun.star.loader.SharedLibrary"),
+-                                bRemoved, identifier);
++                            if (bPlatformFits)
++                                return new BackendImpl::ComponentPackageImpl(
++                                    this, url, name, m_xDynComponentTypeInfo,
++                                    OUSTR("com.sun.star.loader.SharedLibrary"),
++                                    bRemoved, identifier);
++                            else
++                                return new BackendImpl::OtherPlatformPackageImpl(
++                                    this, url, name, m_xDynComponentTypeInfo,
++                                    bRemoved, identifier, aPlatform);
+                         }
+                         if (value.EqualsIgnoreCaseAscii("Java")) {
+                             return new BackendImpl::ComponentPackageImpl(
+@@ -1567,6 +1617,110 @@ void BackendImpl::TypelibraryPackageImpl::processPackage_(
+     }
+ }
+ 
++BackendImpl::OtherPlatformPackageImpl::OtherPlatformPackageImpl(
++    ::rtl::Reference<PackageRegistryBackend> const & myBackend,
++    OUString const & url, OUString const & name,
++    Reference<deployment::XPackageTypeInfo> const & xPackageType,
++    bool bRemoved, OUString const & identifier, OUString const& rPlatform)
++    : Package(myBackend, url, name, name, xPackageType, bRemoved, identifier)
++    , m_aPlatform(rPlatform)
++{
++    OSL_PRECOND(bRemoved, "this class can only be used for removing packages!");
++}
++
++BackendImpl *
++BackendImpl::OtherPlatformPackageImpl::getMyBackend() const
++{
++    BackendImpl * pBackend = static_cast<BackendImpl *>(m_myBackend.get());
++    if (NULL == pBackend)
++    {
++        //Throws a DisposedException
++        check();
++        //We should never get here...
++        throw RuntimeException(
++            OUSTR("Failed to get the BackendImpl"),
++            static_cast<OWeakObject*>(const_cast<OtherPlatformPackageImpl*>(this)));
++    }
++    return pBackend;
++}
++
++Reference<registry::XSimpleRegistry> const
++BackendImpl::OtherPlatformPackageImpl::impl_openRDB() const
++{
++    OUString const aRDB(m_aPlatform + OUString(RTL_CONSTASCII_USTRINGPARAM(".rdb")));
++    OUString const aRDBPath(makeURL(getMyBackend()->getCachePath(), aRDB));
++
++    Reference<registry::XSimpleRegistry> xRegistry;
++
++    try
++    {
++        xRegistry.set(
++                impl_createInstance(
++                    OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.registry.SimpleRegistry"))),
++                UNO_QUERY)
++            ;
++        if (xRegistry.is())
++            xRegistry->open(expandUnoRcUrl(aRDBPath), false, false);
++    }
++    catch (registry::InvalidRegistryException const&)
++    {
++        // If the registry does not exist, we do not need to bother at all
++        xRegistry.set(0);
++    }
++
++    OSL_POSTCOND(xRegistry.is(), "could not create registry for the package's platform");
++    return xRegistry;
++}
++
++Reference<XInterface> const
++BackendImpl::OtherPlatformPackageImpl::impl_createInstance(OUString const& rService)
++const
++{
++    Reference<XComponentContext> const xContext(getMyBackend()->getComponentContext());
++    OSL_ASSERT(xContext.is());
++    Reference<XInterface> xService;
++    if (xContext.is())
++        xService.set(xContext->getServiceManager()->createInstanceWithContext(rService, xContext));
++    return xService;
++}
++
++beans::Optional<beans::Ambiguous<sal_Bool> >
++BackendImpl::OtherPlatformPackageImpl::isRegistered_(
++    ::osl::ResettableMutexGuard& /* guard */,
++    ::rtl::Reference<AbortChannel> const& /* abortChannel */,
++    Reference<XCommandEnvironment> const& /* xCmdEnv */ )
++{
++    return beans::Optional<beans::Ambiguous<sal_Bool> >(sal_True,
++            beans::Ambiguous<sal_Bool>(sal_True, sal_False));
++}
++
++void
++BackendImpl::OtherPlatformPackageImpl::processPackage_(
++    ::osl::ResettableMutexGuard& /* guard */,
++    bool bRegisterPackage,
++    bool /* bStartup */,
++    ::rtl::Reference<AbortChannel> const& /* abortChannel */,
++    Reference<XCommandEnvironment> const& /* xCmdEnv */)
++{
++    OSL_PRECOND(!bRegisterPackage, "this class can only be used for removing packages!");
++    (void) bRegisterPackage;
++
++    OUString const aURL(getURL());
++
++    Reference<registry::XSimpleRegistry> const xServicesRDB(impl_openRDB());
++    Reference<registry::XImplementationRegistration> const xImplReg(
++            impl_createInstance(
++                OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.registry.ImplementationRegistration"))),
++            UNO_QUERY)
++        ;
++    if (xImplReg.is() && xServicesRDB.is())
++        xImplReg->revokeImplementation(aURL, xServicesRDB);
++    if (xServicesRDB.is())
++        xServicesRDB->close();
++
++    getMyBackend()->deleteDataFromDb(aURL);
++}
++
+ } // anon namespace
+ 
+ namespace sdecl = comphelper::service_decl;
+-- 
+1.7.4
+
diff --git a/libreoffice.spec b/libreoffice.spec
index c9d2eb3..94a1309 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -115,6 +115,7 @@ Patch27: 0001-Resolves-rhbz-673819-crash-on-changing-position-of-d.patch
 Patch28: 0001-Resolves-rhbz-670020-crash-in-slidesorting.patch
 Patch29: 0001-Resolves-rhbz-676539-handle-missing-pWindows-from-xW.patch
 Patch30: 0001-Resolves-fdo-33750-i94623-use-optimal-border-width-w.patch
+Patch31: 0001-rhbz-649310-don-t-crash-deregistering-diff.-platform.patch
 
 %{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
 %define instdir %{_libdir}
@@ -748,6 +749,7 @@ mv -f redhat.soc extras/source/palettes/standard.soc
 %patch28 -p1 -b .rhbz670020-crash-in-slidesorting.patch
 %patch29 -p1 -b .rhbz676539-handle-missing-pWindows-from-xW.patch
 %patch30 -p1 -b .fdo33750-i94623-use-optimal-border-width-w.patch
+%patch31 -p1 -b .rhbz649310-don-t-crash-deregistering-diff.-platform.patch
 touch scripting/source/pyprov/delzip
 touch scripting/util/provider/beanshell/delzip
 touch scripting/util/provider/javascript/delzip
@@ -2101,6 +2103,8 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
 - Resolves: rhbz#673819 crash on changing position of header/footer object
 - Resolves: rhbz#670020 crash in slidesorting
 - Resolves: rhbz#676539 handle missing pWindows from xWindows
+- Resolves: rhbz#649310 don't crash deregistering diff. platform ext.
+  (dtardon)
 
 * Mon Jan 24 2011 Caolán McNamara <caolanm at redhat.com> 3.3.0.4-2
 - Resolves: rhbz#671540 fix lonely )


More information about the scm-commits mailing list