diff options
author | offtkp <parisoplop@gmail.com> | 2022-08-27 22:27:35 +0300 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2022-09-14 13:26:08 +0200 |
commit | 5510a77f2c926770dbc312db252a035c7afbe7b3 (patch) | |
tree | 4669e677b96ec95bcf32c32d408207de56fe0426 | |
parent | 868fb06a2ef8f915350c77f0d63c03844fc33f62 (diff) |
Return to starting stream position after checking format
After checking a format now return to starting format position in
GraphicFormatDetector.
Change-Id: Iaaeb2590f3d4928fbfba3f5386cb53e87ca16905
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138936
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
-rw-r--r-- | vcl/source/filter/GraphicFormatDetector.cxx | 84 | ||||
-rw-r--r-- | vcl/source/filter/graphicfilter2.cxx | 44 |
2 files changed, 52 insertions, 76 deletions
diff --git a/vcl/source/filter/GraphicFormatDetector.cxx b/vcl/source/filter/GraphicFormatDetector.cxx index 219915957101..5ae7d5fb67d2 100644 --- a/vcl/source/filter/GraphicFormatDetector.cxx +++ b/vcl/source/filter/GraphicFormatDetector.cxx @@ -35,6 +35,24 @@ constexpr sal_uInt32 SVG_CHECK_SIZE = 2048; constexpr sal_uInt32 WMF_EMF_CHECK_SIZE = 44; constexpr sal_uInt32 DATA_SIZE = 640; +namespace +{ +class SeekGuard +{ +public: + SeekGuard(SvStream& rStream, sal_uInt64 nStartPosition) + : mrStream(rStream) + , mnStartPosition(nStartPosition) + { + } + ~SeekGuard() { mrStream.Seek(mnStartPosition); } + +private: + SvStream& mrStream; + sal_uInt64 mnStartPosition; +}; +} + namespace vcl { bool peekGraphicFormat(SvStream& rStream, OUString& rFormatExtension, bool bTest) @@ -367,6 +385,7 @@ bool GraphicFormatDetector::detect() mnStreamPosition = mrStream.Tell(); mnStreamLength = mrStream.remainingSize(); + SeekGuard aGuard(mrStream, mnStreamPosition); if (!mnStreamLength) { @@ -407,11 +426,11 @@ bool GraphicFormatDetector::checkMET() { if (maFirstBytes[2] != 0xd3) return false; + SeekGuard aGuard(mrStream, mnStreamPosition); mrStream.SetEndian(SvStreamEndian::BIG); mrStream.Seek(mnStreamPosition); sal_uInt16 nFieldSize; sal_uInt8 nMagic; - mrStream.ReadUInt16(nFieldSize).ReadUChar(nMagic); for (int i = 0; i < 3; i++) { @@ -425,16 +444,15 @@ bool GraphicFormatDetector::checkMET() return false; } mrStream.SetEndian(SvStreamEndian::LITTLE); - if (mrStream.GetError()) return false; - maMetadata.mnFormat = GraphicFileFormat::MET; return true; } bool GraphicFormatDetector::checkBMP() { + SeekGuard aGuard(mrStream, mnStreamPosition); bool bRet = false; sal_uInt8 nOffset; @@ -463,10 +481,8 @@ bool GraphicFormatDetector::checkBMP() sal_uInt32 nTemp32; sal_uInt16 nTemp16; sal_uInt32 nCompression; - mrStream.SetEndian(SvStreamEndian::LITTLE); mrStream.Seek(mnStreamPosition + nOffset + 2); - // up to first info mrStream.SeekRel(0x10); @@ -617,12 +633,13 @@ bool GraphicFormatDetector::checkPCX() bool GraphicFormatDetector::checkTIF() { + auto nStmPos = mrStream.Tell(); + SeekGuard aGuard(mrStream, nStmPos); mrStream.Seek(mnStreamPosition); bool bRet = false; sal_uInt8 cByte1 = 0; sal_uInt8 cByte2 = 1; - sal_Int32 nStmPos = mrStream.Tell(); mrStream.ReadUChar(cByte1); mrStream.ReadUChar(cByte2); if (cByte1 == cByte2) @@ -741,7 +758,6 @@ bool GraphicFormatDetector::checkTIF() } } } - mrStream.Seek(nStmPos); return bRet; } @@ -765,6 +781,7 @@ bool GraphicFormatDetector::checkGIF() bool GraphicFormatDetector::checkPNG() { + SeekGuard aGuard(mrStream, mnStreamPosition); if (mnFirstLong == 0x89504e47 && mnSecondLong == 0x0d0a1a0a) { maMetadata.mnFormat = GraphicFileFormat::PNG; @@ -885,8 +902,8 @@ bool GraphicFormatDetector::checkSVM() { sal_uInt32 n32 = 0; bool bRet = false; - - sal_Int32 nStmPos = mrStream.Tell(); + auto nStmPos = mrStream.Tell(); + SeekGuard aGuard(mrStream, nStmPos); mrStream.SetEndian(SvStreamEndian::LITTLE); mrStream.ReadUInt32(n32); if (n32 == 0x44475653) @@ -954,7 +971,6 @@ bool GraphicFormatDetector::checkSVM() } } } - mrStream.Seek(nStmPos); return bRet; } @@ -963,9 +979,9 @@ bool GraphicFormatDetector::checkPCD() if (mnStreamLength < 2055) return false; char sBuffer[8]; + SeekGuard aGuard(mrStream, mnStreamPosition); mrStream.Seek(mnStreamPosition + 2048); sBuffer[mrStream.ReadBytes(sBuffer, 7)] = 0; - if (strncmp(sBuffer, "PCD_IPI", 7) == 0) { maMetadata.mnFormat = GraphicFileFormat::PCD; @@ -976,6 +992,7 @@ bool GraphicFormatDetector::checkPCD() bool GraphicFormatDetector::checkPSD() { + SeekGuard aGuard(mrStream, mnStreamPosition); bool bRet = false; if ((mnFirstLong == 0x38425053) && ((mnSecondLong >> 16) == 1)) { @@ -1077,6 +1094,7 @@ bool GraphicFormatDetector::checkDXF() bool GraphicFormatDetector::checkPCT() { + SeekGuard aGuard(mrStream, mnStreamPosition); if (isPCT(mrStream, mnStreamPosition, mnStreamLength)) { maMetadata.mnFormat = GraphicFileFormat::PCT; @@ -1087,44 +1105,44 @@ bool GraphicFormatDetector::checkPCT() bool GraphicFormatDetector::checkPBM() { - bool bRet = false; - sal_Int32 nStmPos = mrStream.Tell(); + auto nStmPos = mrStream.Tell(); + SeekGuard aGuard(mrStream, nStmPos); sal_uInt8 nFirst = 0, nSecond = 0, nThird = 0; mrStream.ReadUChar(nFirst).ReadUChar(nSecond).ReadUChar(nThird); if (nFirst == 'P' && ((nSecond == '1') || (nSecond == '4')) && isspace(nThird)) - bRet = true; - mrStream.Seek(nStmPos); - if (bRet) + { maMetadata.mnFormat = GraphicFileFormat::PBM; - return bRet; + return true; + } + return false; } bool GraphicFormatDetector::checkPGM() { - bool bRet = false; sal_uInt8 nFirst = 0, nSecond = 0, nThird = 0; - sal_Int32 nStmPos = mrStream.Tell(); + auto nStmPos = mrStream.Tell(); + SeekGuard aGuard(mrStream, nStmPos); mrStream.ReadUChar(nFirst).ReadUChar(nSecond).ReadUChar(nThird); if (nFirst == 'P' && ((nSecond == '2') || (nSecond == '5')) && isspace(nThird)) - bRet = true; - mrStream.Seek(nStmPos); - if (bRet) + { maMetadata.mnFormat = GraphicFileFormat::PGM; - return bRet; + return true; + } + return false; } bool GraphicFormatDetector::checkPPM() { - bool bRet = false; sal_uInt8 nFirst = 0, nSecond = 0, nThird = 0; - sal_Int32 nStmPos = mrStream.Tell(); + auto nStmPos = mrStream.Tell(); + SeekGuard aGuard(mrStream, nStmPos); mrStream.ReadUChar(nFirst).ReadUChar(nSecond).ReadUChar(nThird); if (nFirst == 'P' && ((nSecond == '3') || (nSecond == '6')) && isspace(nThird)) - bRet = true; - mrStream.Seek(nStmPos); - if (bRet) + { maMetadata.mnFormat = GraphicFileFormat::PPM; - return bRet; + return true; + } + return false; } bool GraphicFormatDetector::checkRAS() @@ -1152,12 +1170,10 @@ bool GraphicFormatDetector::checkXBM() { sal_uInt64 nSize = std::min<sal_uInt64>(mnStreamLength, 2048); std::unique_ptr<sal_uInt8[]> pBuffer(new sal_uInt8[nSize]); - + SeekGuard aGuard(mrStream, mnStreamPosition); mrStream.Seek(mnStreamPosition); nSize = mrStream.ReadBytes(pBuffer.get(), nSize); - const char* pBufferAsCharArray = reinterpret_cast<char*>(pBuffer.get()); - if (checkArrayForMatchingStrings(pBufferAsCharArray, nSize, { "#define", "_width" })) { maMetadata.mnFormat = GraphicFileFormat::XBM; @@ -1168,6 +1184,7 @@ bool GraphicFormatDetector::checkXBM() bool GraphicFormatDetector::checkSVG() { + SeekGuard aGuard(mrStream, mnStreamPosition); sal_uInt64 nCheckSize = std::min<sal_uInt64>(mnStreamLength, 256); sal_uInt8 sExtendedOrDecompressedFirstBytes[SVG_CHECK_SIZE]; sal_uInt64 nDecompressedSize = nCheckSize; @@ -1213,6 +1230,7 @@ bool GraphicFormatDetector::checkSVG() nCheckSize = std::min<sal_uInt64>(mnStreamLength, 2048); mrStream.Seek(mnStreamPosition); nCheckSize = mrStream.ReadBytes(sExtendedOrDecompressedFirstBytes, nCheckSize); + mrStream.Seek(mnStreamPosition); } // search for '<svg' @@ -1235,6 +1253,7 @@ bool GraphicFormatDetector::checkSVG() bool GraphicFormatDetector::checkTGA() { + SeekGuard aGuard(mrStream, mnStreamPosition); // Check TGA ver.2 footer bytes if (mnStreamLength > 18) { @@ -1307,6 +1326,7 @@ const GraphicMetadata& GraphicFormatDetector::getMetadata() { return maMetadata; sal_uInt8* GraphicFormatDetector::checkAndUncompressBuffer(sal_uInt8* aUncompressedBuffer, sal_uInt32 nSize, sal_uInt64& nRetSize) { + SeekGuard aGuard(mrStream, mnStreamPosition); if (ZCodec::IsZCompressed(mrStream)) { ZCodec aCodec; diff --git a/vcl/source/filter/graphicfilter2.cxx b/vcl/source/filter/graphicfilter2.cxx index 42dd8816563f..9cda65957aa2 100644 --- a/vcl/source/filter/graphicfilter2.cxx +++ b/vcl/source/filter/graphicfilter2.cxx @@ -119,25 +119,21 @@ void GraphicDescriptor::ImpConstruct() bool GraphicDescriptor::ImpDetectBMP( SvStream& rStm, bool bExtendedInfo ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, bExtendedInfo ); bool bRet = aDetector.detect(); bRet &= aDetector.checkBMP(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectGIF( SvStream& rStm, bool bExtendedInfo ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, bExtendedInfo ); bool bRet = aDetector.detect(); bRet &= aDetector.checkGIF(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } @@ -336,13 +332,11 @@ bool GraphicDescriptor::ImpDetectJPG( SvStream& rStm, bool bExtendedInfo ) bool GraphicDescriptor::ImpDetectPCD( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /*bExtendedInfo*/ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkPCD(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } @@ -425,229 +419,191 @@ bool GraphicDescriptor::ImpDetectPCX( SvStream& rStm ) bool GraphicDescriptor::ImpDetectPNG( SvStream& rStm, bool bExtendedInfo ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, bExtendedInfo ); bool bRet = aDetector.detect(); bRet &= aDetector.checkPNG(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectTIF( SvStream& rStm, bool bExtendedInfo ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, bExtendedInfo ); bool bRet = aDetector.detect(); bRet &= aDetector.checkTIF(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectXBM( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /* bExtendedInfo */ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkXBM(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectXPM( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /* bExtendedInfo */ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkXPM(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectPBM( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /* bExtendedInfo */ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkPBM(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectPGM( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /* bExtendedInfo */ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkPGM(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectPPM( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /* bExtendedInfo */ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkPPM(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectRAS( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /* bExtendedInfo */ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkRAS(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectTGA( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /* bExtendedInfo */ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkTGA(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectPSD( SvStream& rStm, bool bExtendedInfo ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, bExtendedInfo ); bool bRet = aDetector.detect(); bRet &= aDetector.checkPSD(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectEPS( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /*bExtendedInfo*/ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkEPS(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectDXF( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /*bExtendedInfo*/ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkDXF(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectMET( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /*bExtendedInfo*/ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkMET(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectPCT( SvStream& rStm, bool ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /*bExtendedInfo*/ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkPCT(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectSVM( SvStream& rStm, bool bExtendedInfo ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, bExtendedInfo ); bool bRet = aDetector.detect(); bRet &= aDetector.checkSVM(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectWMF(SvStream& rStm, bool /*bExtendedInfo*/) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /*bExtendedInfo*/ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkWMF(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectEMF(SvStream& rStm, bool bExtendedInfo) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, bExtendedInfo ); bool bRet = aDetector.detect(); bRet &= aDetector.checkEMF(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectSVG( SvStream& rStm, bool /*bExtendedInfo*/ ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, false /*bExtendedInfo*/ ); bool bRet = aDetector.detect(); bRet &= aDetector.checkSVG(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } bool GraphicDescriptor::ImpDetectWEBP( SvStream& rStm, bool bExtendedInfo ) { - sal_Int32 nStmPos = rStm.Tell(); vcl::GraphicFormatDetector aDetector( rStm, aPathExt, bExtendedInfo ); bool bRet = aDetector.detect(); bRet &= aDetector.checkWEBP(); if ( bRet ) aMetadata = aDetector.getMetadata(); - rStm.Seek( nStmPos ); return bRet; } |