summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorofftkp <parisoplop@gmail.com>2022-08-27 22:27:35 +0300
committerTomaž Vajngerl <quikee@gmail.com>2022-09-14 13:26:08 +0200
commit5510a77f2c926770dbc312db252a035c7afbe7b3 (patch)
tree4669e677b96ec95bcf32c32d408207de56fe0426
parent868fb06a2ef8f915350c77f0d63c03844fc33f62 (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.cxx84
-rw-r--r--vcl/source/filter/graphicfilter2.cxx44
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;
}