diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-01-26 21:01:06 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-01-26 21:04:30 +0000 |
commit | e17a34e957c21a8cd2977b1b0e1c9a427c244aed (patch) | |
tree | 675432b28e9051bb513a5dc5a36a5c30d946f2ed /filter | |
parent | Related: tdf#104312 create palette on demand (diff) | |
download | core-e17a34e957c21a8cd2977b1b0e1c9a427c244aed.tar.gz core-e17a34e957c21a8cd2977b1b0e1c9a427c244aed.zip |
ofz: check if the stream is able to meet the eps len claim before reading
Change-Id: I65407bffb67449e203b8ead23554a4e88387d214
Diffstat (limited to 'filter')
-rw-r--r-- | filter/source/graphicfilter/ieps/ieps.cxx | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/filter/source/graphicfilter/ieps/ieps.cxx b/filter/source/graphicfilter/ieps/ieps.cxx index 912be13253f3..090bc6543e87 100644 --- a/filter/source/graphicfilter/ieps/ieps.cxx +++ b/filter/source/graphicfilter/ieps/ieps.cxx @@ -540,7 +540,7 @@ ipsGraphicImport( SvStream & rStream, Graphic & rGraphic, FilterConfigItem* ) Graphic aGraphic; bool bRetValue = false; bool bHasPreview = false; - sal_uInt32 nSignature, nPSStreamPos, nPSSize; + sal_uInt32 nSignature = 0, nPSStreamPos, nPSSize = 0; sal_uInt32 nSizeWMF = 0; sal_uInt32 nPosWMF = 0; sal_uInt32 nSizeTIFF = 0; @@ -585,13 +585,20 @@ ipsGraphicImport( SvStream & rStream, Graphic & rGraphic, FilterConfigItem* ) nPSStreamPos = nOrigPos; // no preview available _>so we must get the size manually nPSSize = rStream.Seek( STREAM_SEEK_TO_END ) - nOrigPos; } + std::unique_ptr<sal_uInt8[]> pHeader( new sal_uInt8[ 22 ] ); rStream.Seek( nPSStreamPos ); rStream.ReadBytes(pHeader.get(), 22); // check PostScript header - if ( ImplSearchEntry( pHeader.get(), reinterpret_cast<sal_uInt8 const *>("%!PS-Adobe"), 10, 10 ) && - ImplSearchEntry( &pHeader[ 15 ], reinterpret_cast<sal_uInt8 const *>("EPS"), 3, 3 ) ) + bool bOk = ImplSearchEntry(pHeader.get(), reinterpret_cast<sal_uInt8 const *>("%!PS-Adobe"), 10, 10) && + ImplSearchEntry(&pHeader[ 15 ], reinterpret_cast<sal_uInt8 const *>("EPS"), 3, 3); + if (bOk) + { + rStream.Seek(nPSStreamPos); + bOk = rStream.remainingSize() >= nPSSize; + SAL_WARN_IF(!bOk, "filter.eps", "eps claims to be: " << nPSSize << " in size, but only " << rStream.remainingSize() << " remains"); + } + if (bOk) { - rStream.Seek( nPSStreamPos ); std::unique_ptr<sal_uInt8[]> pBuf( new sal_uInt8[ nPSSize ] ); sal_uInt32 nBufStartPos = rStream.Tell(); |