summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2017-07-05 17:30:27 +0100
committerMichael Meeks <michael.meeks@collabora.com>2017-07-06 11:12:19 +0200
commit4a8f8c09edb06e4ff812d676bc7726a8b4f6ebe8 (patch)
tree9665049f1f19ffcfb569ad9e7ffd1467037ba061
parent5eeed755a2eadbadd7a2e0c06216258af028a96e (diff)
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 <ci@libreoffice.org> Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r--package/source/zipapi/XBufferedThreadedStream.cxx5
-rw-r--r--package/source/zipapi/XBufferedThreadedStream.hxx7
-rw-r--r--package/source/zipapi/XUnbufferedStream.hxx2
-rw-r--r--package/source/zipapi/ZipFile.cxx6
4 files changed, 12 insertions, 8 deletions
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;
}