From 6e0caeee8a36498080f0edf1b53a28945f8a2d75 Mon Sep 17 00:00:00 2001 From: Martin Gallwey Date: Wed, 7 Mar 2001 18:24:15 +0000 Subject: [PATCH] #84734# Restrict the number of bytes read from a compressed stream when checking for zip file header to a 32k LZ77 window --- package/inc/Inflater.hxx | 6 ++++-- package/inc/ZipFile.hxx | 7 +++---- package/source/zipapi/Inflater.cxx | 14 +++++++++----- package/source/zipapi/ZipFile.cxx | 22 ++++++++-------------- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/package/inc/Inflater.hxx b/package/inc/Inflater.hxx index a3c233c0ea6e..81f2b15b4aaa 100644 --- a/package/inc/Inflater.hxx +++ b/package/inc/Inflater.hxx @@ -2,9 +2,9 @@ * * $RCSfile: Inflater.hxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: mtg $ $Date: 2000-12-19 21:55:35 $ + * last change: $Author: mtg $ $Date: 2001-03-07 19:24:14 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -113,6 +113,8 @@ public: throw(::com::sun::star::uno::RuntimeException); virtual sal_Bool SAL_CALL needsDictionary( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL finish( ) + throw(::com::sun::star::uno::RuntimeException); virtual sal_Bool SAL_CALL finished( ) throw(::com::sun::star::uno::RuntimeException); virtual sal_Int32 SAL_CALL doInflateSegment( ::com::sun::star::uno::Sequence< sal_Int8 >& rBuffer, sal_Int32 nNewOffset, sal_Int32 nNewLength ) diff --git a/package/inc/ZipFile.hxx b/package/inc/ZipFile.hxx index 251e8790eecd..4a6af67d9021 100644 --- a/package/inc/ZipFile.hxx +++ b/package/inc/ZipFile.hxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipFile.hxx,v $ * - * $Revision: 1.8 $ + * $Revision: 1.9 $ * - * last change: $Author: mtg $ $Date: 2000-12-19 21:55:35 $ + * last change: $Author: mtg $ $Date: 2001-03-07 19:24:14 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -114,10 +114,9 @@ private: ::rtl::OUString sComment; /* zip file comment */ EntryHash aEntries; ByteGrabber aGrabber; + Inflater aInflater; com::sun::star::uno::Reference < com::sun::star::io::XInputStream > xStream; public: - ZipFile( com::sun::star::uno::Reference < com::sun::star::io::XInputStream > &xInput) - throw(::com::sun::star::io::IOException, com::sun::star::package::ZipException, com::sun::star::uno::RuntimeException); ZipFile( com::sun::star::uno::Reference < com::sun::star::io::XInputStream > &xInput, sal_Bool bInitialise) throw(::com::sun::star::io::IOException, com::sun::star::package::ZipException, com::sun::star::uno::RuntimeException); void updateFromManList(std::vector < ManifestEntry * > &rManList); diff --git a/package/source/zipapi/Inflater.cxx b/package/source/zipapi/Inflater.cxx index 40ad73f64573..8e1c311e054a 100644 --- a/package/source/zipapi/Inflater.cxx +++ b/package/source/zipapi/Inflater.cxx @@ -2,9 +2,9 @@ * * $RCSfile: Inflater.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: mtg $ $Date: 2000-12-19 21:55:39 $ + * last change: $Author: mtg $ $Date: 2001-03-07 19:24:15 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -178,6 +178,11 @@ sal_Bool SAL_CALL Inflater::needsDictionary( ) return bNeedDict; } +void SAL_CALL Inflater::finish( ) + throw(com::sun::star::uno::RuntimeException) +{ + bFinish = sal_True; +} sal_Bool SAL_CALL Inflater::finished( ) throw(com::sun::star::uno::RuntimeException) { @@ -222,8 +227,7 @@ void SAL_CALL Inflater::reset( ) throw(com::sun::star::uno::RuntimeException) { z_inflateReset(pStream); - bNeedDict = sal_False; - bFinished = sal_False; + bFinish = bNeedDict = bFinished = sal_False; nOffset = nLength = 0; } @@ -246,7 +250,7 @@ sal_Int32 Inflater::doInflateBytes (com::sun::star::uno::Sequence < sal_Int8 > pStream->next_out = (unsigned char*) rBuffer.getArray() + nNewOffset; pStream->avail_out = nNewLength; - nResult = ::z_inflate(pStream, Z_PARTIAL_FLUSH); + nResult = ::z_inflate(pStream, bFinish ? Z_SYNC_FLUSH : Z_PARTIAL_FLUSH); switch (nResult) { diff --git a/package/source/zipapi/ZipFile.cxx b/package/source/zipapi/ZipFile.cxx index 41effcf39f4d..ea5c682c923f 100644 --- a/package/source/zipapi/ZipFile.cxx +++ b/package/source/zipapi/ZipFile.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipFile.cxx,v $ * - * $Revision: 1.16 $ + * $Revision: 1.17 $ * - * last change: $Author: mtg $ $Date: 2001-03-07 16:09:44 $ + * last change: $Author: mtg $ $Date: 2001-03-07 19:24:15 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -69,17 +69,11 @@ using namespace com::sun::star::package::ZipConstants; /** This class is used to read entries from a zip file */ -ZipFile::ZipFile (uno::Reference < io::XInputStream > &xInput) - throw(io::IOException, package::ZipException, uno::RuntimeException) -: xStream(xInput) -, aGrabber(xInput) -{ - readCEN(); -} ZipFile::ZipFile( uno::Reference < io::XInputStream > &xInput, sal_Bool bInitialise) throw(io::IOException, package::ZipException, uno::RuntimeException) : xStream(xInput) , aGrabber(xInput) +, aInflater (sal_True) { if (bInitialise) readCEN(); @@ -209,19 +203,19 @@ sal_uInt32 SAL_CALL ZipFile::getHeader(const package::ZipEntry& rEntry) } else if (rEntry.nMethod == DEFLATED) { + /* uno::Reference < io::XInputStream > xEntryStream = getInputStream (rEntry); if (xEntryStream->readBytes(aSequence, 4) < 4) return 0; - /* - Inflater aInflater ( sal_True ); - sal_Int32 nSize = rEntry.nCompressedSize < 50 ? rEntry.nCompressedSize : 50; + */ + sal_Int32 nSize = rEntry.nCompressedSize < 32768 ? rEntry.nCompressedSize : 32768; uno::Sequence < sal_Int8 > aCompSeq (nSize ); if (xStream->readBytes(aCompSeq, nSize) < nSize) return 0; + aInflater.finish(); aInflater.setInput(aCompSeq); aInflater.doInflate(aSequence); - aInflater.end(); - */ + aInflater.reset(); } return (static_cast < sal_uInt32 > (static_cast < sal_uInt8> (aSequence[0]& 0xFF)