diff options
author | Mohammed Abdul Azeem <azeemmysore@gmail.com> | 2017-07-19 00:34:43 +0530 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2017-07-19 13:49:04 +0200 |
commit | def6f7f749dd0a175427e51d8620b1406084d553 (patch) | |
tree | b2b1d03646f4be52e8e2cfdadde181eaa3466582 /package/source/zipapi | |
parent | 887e9829dc22883386934993b14374b8559cc95e (diff) |
tdf#108835 Fixed writer crash on adding Autocorrect Entry:
ZipPackageStream::saveChild seeks and reads on the same
stream, so it cannot be done parallely. Also, read on
BufferedStream tries to aquire the same mutes, which is
already aquired by the calling method resulting in
deadlock. Using UnbufferedStream here should solve both.
Change-Id: I25b7ca2ff3c31125cf107fe404f9af66435bec7d
Reviewed-on: https://gerrit.libreoffice.org/40160
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'package/source/zipapi')
-rw-r--r-- | package/source/zipapi/ZipFile.cxx | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/package/source/zipapi/ZipFile.cxx b/package/source/zipapi/ZipFile.cxx index 12c0c5ff86d1..817a0e2798bb 100644 --- a/package/source/zipapi/ZipFile.cxx +++ b/package/source/zipapi/ZipFile.cxx @@ -609,6 +609,7 @@ uno::Reference< XInputStream > ZipFile::createStreamForZipEntry( const ::rtl::Reference< EncryptionData > &rData, sal_Int8 nStreamMode, bool bIsEncrypted, + const bool bUseBufferedStream, const OUString& aMediaType ) { ::osl::MutexGuard aGuard( m_aMutexHolder->GetMutex() ); @@ -616,6 +617,9 @@ uno::Reference< XInputStream > ZipFile::createStreamForZipEntry( rtl::Reference< XUnbufferedStream > xSrcStream = new XUnbufferedStream( m_xContext, aMutexHolder, rEntry, xStream, rData, nStreamMode, bIsEncrypted, aMediaType, bRecoveryMode); + if (!bUseBufferedStream) + return xSrcStream.get(); + uno::Reference<io::XInputStream> xBufStream; static const sal_Int32 nThreadingThreshold = 10000; @@ -698,14 +702,15 @@ uno::Reference< XInputStream > ZipFile::getDataStream( ZipEntry& rEntry, uno::Reference< XInputStream > ZipFile::getRawData( ZipEntry& rEntry, const ::rtl::Reference< EncryptionData >& rData, bool bIsEncrypted, - const rtl::Reference<comphelper::RefCountedMutex>& aMutexHolder ) + const rtl::Reference<comphelper::RefCountedMutex>& aMutexHolder, + const bool bUseBufferedStream ) { ::osl::MutexGuard aGuard( m_aMutexHolder->GetMutex() ); if ( rEntry.nOffset <= 0 ) readLOC( rEntry ); - return createStreamForZipEntry ( aMutexHolder, rEntry, rData, UNBUFF_STREAM_RAW, bIsEncrypted ); + return createStreamForZipEntry ( aMutexHolder, rEntry, rData, UNBUFF_STREAM_RAW, bIsEncrypted, bUseBufferedStream ); } uno::Reference< XInputStream > ZipFile::getWrappedRawStream( @@ -722,7 +727,7 @@ uno::Reference< XInputStream > ZipFile::getWrappedRawStream( if ( rEntry.nOffset <= 0 ) readLOC( rEntry ); - return createStreamForZipEntry ( aMutexHolder, rEntry, rData, UNBUFF_STREAM_WRAPPEDRAW, true, aMediaType ); + return createStreamForZipEntry ( aMutexHolder, rEntry, rData, UNBUFF_STREAM_WRAPPEDRAW, true, true, aMediaType ); } bool ZipFile::readLOC( ZipEntry &rEntry ) |