[Libreoffice-commits] core.git: Branch 'libreoffice-6-2' - filter/source include/vcl vcl/source

Luboš Luňák (via logerrit) logerrit at kemper.freedesktop.org
Wed Apr 24 10:09:53 UTC 2019


 filter/source/msfilter/msdffimp.cxx |    6 +++++-
 include/vcl/graphicfilter.hxx       |    3 ++-
 vcl/source/filter/graphicfilter.cxx |    4 ++--
 3 files changed, 9 insertions(+), 4 deletions(-)

New commits:
commit 2dd410421331eb2a593a9e9ca2f73e2aa1c2a694
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Tue Apr 23 15:48:41 2019 +0200
Commit:     Xisco Faulí <xiscofauli at libreoffice.org>
CommitDate: Wed Apr 24 12:09:04 2019 +0200

    lazy image loading shouldn't read the entire .xls file (tdf#124828)
    
    b11188835d3b87cd changed msfilter to use
    GraphicFilter::ImportUnloadedGraphic() to lazy-load images
    from the document. However, that function in some cases simply
    reads the entire rest of the passed SvStream, which in this case
    is the entire .xls file. And the document from tdf#124828 is ~50MiB
    and contains ~4000 images => 100+ GiB memory required.
    
    Change-Id: I74926383204ec642eabb28b62e2cf2e1ff8054a9
    Reviewed-on: https://gerrit.libreoffice.org/71136
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
    (cherry picked from commit af84fc9d906626255aaf136eefc5e55236e0e8a6)
    Reviewed-on: https://gerrit.libreoffice.org/71221
    Reviewed-by: Xisco Faulí <xiscofauli at libreoffice.org>

diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 30dc80c92f8b..c9087180ecdf 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -6553,7 +6553,11 @@ bool SvxMSDffManager::GetBLIPDirect( SvStream& rBLIPStream, Graphic& rData, tool
         else
         {   // and unleash our filter
             GraphicFilter& rGF = GraphicFilter::GetGraphicFilter();
-            Graphic aGraphic = rGF.ImportUnloadedGraphic(*pGrStream);
+            // ImportUnloadedGraphic() may simply read the entire rest of the stream,
+            // which may be very large if the whole document is large. Limit the read
+            // size to the size of this record.
+            sal_uInt64 maxSize = pGrStream == &rBLIPStream ? nLength : 0;
+            Graphic aGraphic = rGF.ImportUnloadedGraphic(*pGrStream, maxSize);
             if (aGraphic)
             {
                 rData = aGraphic;
diff --git a/include/vcl/graphicfilter.hxx b/include/vcl/graphicfilter.hxx
index fe084136ce5a..db3d78371480 100644
--- a/include/vcl/graphicfilter.hxx
+++ b/include/vcl/graphicfilter.hxx
@@ -294,7 +294,8 @@ public:
                                    css::uno::Sequence< css::beans::PropertyValue >* pFilterData,
                                    WmfExternal const *pExtHeader = nullptr );
 
-    Graphic ImportUnloadedGraphic(SvStream& rIStream);
+    // Setting sizeLimit limits how much will be read from the stream.
+    Graphic ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 sizeLimit = 0);
 
     const FilterErrorEx&    GetLastError() const { return *pErrorEx;}
     void                    ResetLastError();
diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx
index 6eaccfbc37ee..0cc982e68082 100644
--- a/vcl/source/filter/graphicfilter.cxx
+++ b/vcl/source/filter/graphicfilter.cxx
@@ -1428,7 +1428,7 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra
     }
 }
 
-Graphic GraphicFilter::ImportUnloadedGraphic(SvStream& rIStream)
+Graphic GraphicFilter::ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 sizeLimit)
 {
     Graphic aGraphic;
     sal_uInt16 nFormat = GRFILTER_FORMAT_DONTKNOW;
@@ -1443,7 +1443,7 @@ Graphic GraphicFilter::ImportUnloadedGraphic(SvStream& rIStream)
     ErrCode nStatus = ImpTestOrFindFormat("", rIStream, nFormat);
 
     rIStream.Seek(nStreamBegin);
-    const sal_uInt32 nStreamLength(rIStream.remainingSize());
+    const sal_uInt32 nStreamLength( sizeLimit ? sizeLimit : rIStream.remainingSize());
 
     OUString aFilterName = pConfig->GetImportFilterName(nFormat);
     OUString aExternalFilterName = pConfig->GetExternalFilterName(nFormat, false);


More information about the Libreoffice-commits mailing list