package/source/zipapi/XBufferedThreadedStream.cxx |    5 +++--
 package/source/zipapi/XBufferedThreadedStream.hxx |    7 ++++---
 package/source/zipapi/XUnbufferedStream.hxx       |    2 ++
 package/source/zipapi/ZipFile.cxx                 |    6 +++---
 4 files changed, 12 insertions(+), 8 deletions(-)

New commits:
commit 4a8f8c09edb06e4ff812d676bc7726a8b4f6ebe8
Author: Michael Meeks <michael.me...@collabora.com>
Date:   Wed Jul 5 17:30:27 2017 +0100

    tdf#108821 - fixed bad alloc on opening large file
    
    Workaround for streams with size > SAL_MAX_INT32.
    
    More complicated ways using available() and navigating cross-thread
    are possible, but probably harder to maintain.
    
    Change-Id: I721b1f38055dfcea03fef555b8a5fd93dfc1b886
    Reviewed-on: https://gerrit.libreoffice.org/39374
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Michael Meeks <michael.me...@collabora.com>

diff --git a/package/source/zipapi/XBufferedThreadedStream.cxx 
b/package/source/zipapi/XBufferedThreadedStream.cxx
index 990844af0bd7..87b7349cccba 100644
--- a/package/source/zipapi/XBufferedThreadedStream.cxx
+++ b/package/source/zipapi/XBufferedThreadedStream.cxx
@@ -50,10 +50,11 @@ private:
 }
 
 XBufferedThreadedStream::XBufferedThreadedStream(
-                    const Reference<XInputStream>& xSrcStream )
+                    const Reference<XInputStream>& xSrcStream,
+                    sal_Int64 nStreamSize)
 : mxSrcStream( xSrcStream )
 , mnPos(0)
-, mnStreamSize( xSrcStream->available() )
+, mnStreamSize( nStreamSize )
 , mnOffset( 0 )
 , mxUnzippingThread( new UnzippingThread(*this) )
 , mbTerminateThread( false )
diff --git a/package/source/zipapi/XBufferedThreadedStream.hxx 
b/package/source/zipapi/XBufferedThreadedStream.hxx
index b047b25fdf85..9ba908e01f5e 100644
--- a/package/source/zipapi/XBufferedThreadedStream.hxx
+++ b/package/source/zipapi/XBufferedThreadedStream.hxx
@@ -23,8 +23,8 @@ class XBufferedThreadedStream : public cppu::WeakImplHelper< 
css::io::XInputStre
 {
 private:
     const css::uno::Reference<XInputStream> mxSrcStream;
-    size_t mnPos;                                           /// position in 
stream
-    size_t mnStreamSize;                                    /// available size 
of stream
+    sal_Int64 mnPos;                                           /// position in 
stream
+    sal_Int64 mnStreamSize;                                    /// available 
size of stream
 
     Buffer maInUseBuffer;                                   /// Buffer block 
in use
     int mnOffset;                                           /// position in 
maInUseBuffer
@@ -59,7 +59,8 @@ private:
 
 public:
     XBufferedThreadedStream(
-                  const css::uno::Reference<XInputStream>& xSrcStream );
+                  const css::uno::Reference<XInputStream>& xSrcStream,
+                  sal_Int64 nStreamSize /* cf. sal_Int32 available(); */ );
 
     virtual ~XBufferedThreadedStream() override;
 
diff --git a/package/source/zipapi/XUnbufferedStream.hxx 
b/package/source/zipapi/XUnbufferedStream.hxx
index 4c05b9dad3d9..a463983b90b0 100644
--- a/package/source/zipapi/XUnbufferedStream.hxx
+++ b/package/source/zipapi/XUnbufferedStream.hxx
@@ -81,6 +81,8 @@ public:
                  const css::uno::Reference < css::io::XInputStream >& 
xRawStream,
                  const ::rtl::Reference< EncryptionData >& rData );
 
+    sal_Int64 getSize() { return mnZipSize; }
+
     virtual ~XUnbufferedStream() override;
 
     // XInputStream
diff --git a/package/source/zipapi/ZipFile.cxx 
b/package/source/zipapi/ZipFile.cxx
index 2a45119f11d2..c331282f9c76 100644
--- a/package/source/zipapi/ZipFile.cxx
+++ b/package/source/zipapi/ZipFile.cxx
@@ -613,16 +613,16 @@ uno::Reference< XInputStream > 
ZipFile::createStreamForZipEntry(
 {
     ::osl::MutexGuard aGuard( m_aMutexHolder->GetMutex() );
 
-    uno::Reference<io::XInputStream> xSrcStream = new XUnbufferedStream(
+    rtl::Reference< XUnbufferedStream > xSrcStream = new XUnbufferedStream(
         m_xContext, aMutexHolder, rEntry, xStream, rData, nStreamMode, 
bIsEncrypted, aMediaType, bRecoveryMode);
 
     uno::Reference<io::XInputStream> xBufStream;
     static const sal_Int32 nThreadingThreshold = 10000;
 
     if( xSrcStream->available() > nThreadingThreshold )
-        xBufStream = new XBufferedThreadedStream(xSrcStream);
+        xBufStream = new XBufferedThreadedStream(xSrcStream.get(), 
xSrcStream->getSize());
     else
-        xBufStream = new XBufferedStream(xSrcStream);
+        xBufStream = new XBufferedStream(xSrcStream.get());
 
     return xBufStream;
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to