Date: prev next · Thread: first prev next last
2012 Archives by date, by thread · List index



propose the following for libreoffice-3-5, which fixes
a crash regression in 3.5 when saving pictures.

before fd95f1ab6220c6a530fd2e4e727417f504a5db51 it used to work this
way: the getInputStream would call one of 3 duplicated GetDocumentStream
methods, which would then create an XInputStream and wrap it in a
SvStream.  then getInputStream would wrap that SvStream again in an
XInputStream.

during the utl::UcbStreamHelper::CreateStream the
UcbLockBytes::setInputStream_Impl is called, which determines that the
XInputStream is not seekable, and thus decides to copy the stream into a
temp file, and thus the code before my refactoring survived the fact
that the XStorage where the original XInputStream was taken from went
out of scope, invalidating said XInputStream.

if you are thoroughly confused by now, then you have reached an accurate
understanding of the situation.

so this patch just restores the aspects of the previous mis-design that
accidentally prevent the crash.

On 29/02/12 22:37, Michael Stahl wrote:
 svx/source/svdraw/svdograf.cxx |    8 ++++++++
 1 file changed, 8 insertions(+)

New commits:
commit 0c6d89941118368ccbb596362a545db5d3a07dbe
Author: Michael Stahl <mstahl@redhat.com>
Date:   Wed Feb 29 22:34:51 2012 +0100

    fdo#46340: fix crash in SdrGrafObj::getInputStream:
    
    Add the ridiculous hack that used to be here (and distributed across
    various GetDocumentStream methods to make it non-obvious)
    that makes this not crash by accident.
    
    (regression from fd95f1ab6220c6a530fd2e4e727417f504a5db51)

diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx
index 23f81df..6fd9cf3 100644
--- a/svx/source/svdraw/svdograf.cxx
+++ b/svx/source/svdraw/svdograf.cxx
@@ -1335,6 +1335,14 @@ Reference< XInputStream > SdrGrafObj::getInputStream()
             ::comphelper::LifecycleProxy proxy;
             xStream.set(
                 pModel->GetDocumentStream(pGraphic->GetUserData(), proxy));
+            // fdo#46340: this may look completely insane, and it is,
+            // but it also prevents a crash: the LifecycleProxy will go out
+            // of scope, but the xStream must be returned; the UcbStreamHelper
+            // will actually copy the xStream to a temp file (because it is
+            // not seekable), which makes it not crash...
+            SvStream *const pStream =
+                utl::UcbStreamHelper::CreateStream(xStream);
+            xStream.set(new utl::OInputStreamWrapper(pStream, true));
         }
         else if( pGraphic && GetGraphic().IsLink() )
         {



Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.