From b5f2402e023fb438341895ad0f81020571c5ec5a Mon Sep 17 00:00:00 2001 From: Armin Le Grand Date: Mon, 21 Aug 2017 18:34:32 +0200 Subject: emfplus: Corrected ReadWindowMetafile There are two places which do hand over not a complete SvStream staring at pos zero, but pass a seek position indirectly in that stream. Thus this needs to be used. There is one usage in sc that copies the data to a MemStream to avoid that, so this hints that this 'trap/feature' was not known to everyone using it Change-Id: I94139b86c8bdd82879124c574bc3014e02d9ab5f Reviewed-on: https://gerrit.libreoffice.org/41399 Tested-by: Jenkins Reviewed-by: Armin Le Grand --- vcl/source/filter/wmf/wmf.cxx | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/vcl/source/filter/wmf/wmf.cxx b/vcl/source/filter/wmf/wmf.cxx index fe9a9f4429ca..ac56c74810f4 100644 --- a/vcl/source/filter/wmf/wmf.cxx +++ b/vcl/source/filter/wmf/wmf.cxx @@ -25,12 +25,25 @@ bool ReadWindowMetafile( SvStream& rStream, GDIMetaFile& rMTF ) { - // Use new method to import Metafile. First, read binary data to mem array - const sal_uInt32 nStreamLength(rStream.Seek(STREAM_SEEK_TO_END)); + // tdf#111484 Use new method to import Metafile. Take curent StreamPos + // into account (used by SwWW8ImplReader::ReadGrafFile and by + // SwWw6ReadMetaStream, so do *not* ignore. OTOH XclImpDrawing::ReadWmf + // is nice enough to copy to an own MemStream to avoid that indirect + // parameter passing...) + const sal_uInt32 nStreamStart(rStream.Tell()); + const sal_uInt32 nStreamEnd(rStream.Seek(STREAM_SEEK_TO_END)); + + if (nStreamStart >= nStreamEnd) + { + return false; + } + + // Read binary data to mem array + const sal_uInt32 nStreamLength(nStreamEnd - nStreamStart); VectorGraphicDataArray aNewData(nStreamLength); - rStream.Seek(0); + rStream.Seek(nStreamStart); rStream.ReadBytes(aNewData.begin(), nStreamLength); - rStream.Seek(0); + rStream.Seek(nStreamStart); if (rStream.good()) { -- cgit