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
- [REVIEW][3-5][3-5-1] fdo#46340 add more insanity to SdrGrafObj::getInputStream so it doesn't crash as much · Michael Stahl
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.