Kaydet (Commit) fc6e9a71 authored tarafından Caolán McNamara's avatar Caolán McNamara Kaydeden (comit) Michael Stahl

ofz#7165 set a recursion limit for svm in svm

Change-Id: Id9089986012588690b6d5e33cd71d094ef2357dd
Reviewed-on: https://gerrit.libreoffice.org/51984Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMichael Stahl <Michael.Stahl@cib.de>
üst c4674e8a
...@@ -38,7 +38,7 @@ namespace tools { ...@@ -38,7 +38,7 @@ namespace tools {
class PolyPolygon; class PolyPolygon;
} }
class Gradient; class Gradient;
struct ImplMetaReadData;
#define GDI_METAFILE_END ((size_t)0xFFFFFFFF) #define GDI_METAFILE_END ((size_t)0xFFFFFFFF)
#define GDI_METAFILE_LABEL_NOTFOUND ((size_t)0xFFFFFFFF) #define GDI_METAFILE_LABEL_NOTFOUND ((size_t)0xFFFFFFFF)
...@@ -53,6 +53,9 @@ enum class MtfConversion ...@@ -53,6 +53,9 @@ enum class MtfConversion
typedef Color (*ColorExchangeFnc)( const Color& rColor, const void* pColParam ); typedef Color (*ColorExchangeFnc)( const Color& rColor, const void* pColParam );
typedef BitmapEx (*BmpExchangeFnc)( const BitmapEx& rBmpEx, const void* pBmpParam ); typedef BitmapEx (*BmpExchangeFnc)( const BitmapEx& rBmpEx, const void* pBmpParam );
VCL_DLLPUBLIC SvStream& ReadGDIMetaFile(SvStream& rIStm, GDIMetaFile& rGDIMetaFile, ImplMetaReadData* pReadData = nullptr);
VCL_DLLPUBLIC SvStream& WriteGDIMetaFile( SvStream& rOStm, const GDIMetaFile& rGDIMetaFile );
class VCL_DLLPUBLIC GDIMetaFile final class VCL_DLLPUBLIC GDIMetaFile final
{ {
private: private:
...@@ -187,8 +190,8 @@ public: ...@@ -187,8 +190,8 @@ public:
// Stream-operators write (still) the old format // Stream-operators write (still) the old format
// and read both the old and the new format // and read both the old and the new format
friend VCL_DLLPUBLIC SvStream& ReadGDIMetaFile( SvStream& rIStm, GDIMetaFile& rGDIMetaFile ); friend VCL_DLLPUBLIC SvStream& ReadGDIMetaFile(SvStream& rIStm, GDIMetaFile& rGDIMetaFile, ImplMetaReadData* pReadData);
friend VCL_DLLPUBLIC SvStream& WriteGDIMetaFile( SvStream& rOStm, const GDIMetaFile& rGDIMetaFile ); friend VCL_DLLPUBLIC SvStream& WriteGDIMetaFile(SvStream& rOStm, const GDIMetaFile& rGDIMetaFile);
/// Creates an antialiased thumbnail /// Creates an antialiased thumbnail
bool CreateThumbnail(BitmapEx& rBitmapEx, bool CreateThumbnail(BitmapEx& rBitmapEx,
......
...@@ -44,9 +44,11 @@ enum class DrawTextFlags; ...@@ -44,9 +44,11 @@ enum class DrawTextFlags;
struct ImplMetaReadData struct ImplMetaReadData
{ {
rtl_TextEncoding meActualCharSet; rtl_TextEncoding meActualCharSet;
int mnParseDepth;
ImplMetaReadData() : ImplMetaReadData()
meActualCharSet( RTL_TEXTENCODING_ASCII_US ) : meActualCharSet(RTL_TEXTENCODING_ASCII_US)
, mnParseDepth(0)
{} {}
}; };
......
...@@ -2664,7 +2664,31 @@ sal_uLong GDIMetaFile::GetSizeBytes() const ...@@ -2664,7 +2664,31 @@ sal_uLong GDIMetaFile::GetSizeBytes() const
return nSizeBytes; return nSizeBytes;
} }
SvStream& ReadGDIMetaFile( SvStream& rIStm, GDIMetaFile& rGDIMetaFile ) namespace
{
class DepthGuard
{
private:
ImplMetaReadData& m_rData;
rtl_TextEncoding m_eOrigCharSet;
public:
DepthGuard(ImplMetaReadData& rData, SvStream& rIStm)
: m_rData(rData)
, m_eOrigCharSet(m_rData.meActualCharSet)
{
++m_rData.mnParseDepth;
m_rData.meActualCharSet = rIStm.GetStreamCharSet();
}
bool TooDeep() const { return m_rData.mnParseDepth > 1024; }
~DepthGuard()
{
--m_rData.mnParseDepth;
m_rData.meActualCharSet = m_eOrigCharSet;
}
};
}
SvStream& ReadGDIMetaFile(SvStream& rIStm, GDIMetaFile& rGDIMetaFile, ImplMetaReadData* pData)
{ {
if (rIStm.GetError()) if (rIStm.GetError())
{ {
...@@ -2698,12 +2722,20 @@ SvStream& ReadGDIMetaFile( SvStream& rIStm, GDIMetaFile& rGDIMetaFile ) ...@@ -2698,12 +2722,20 @@ SvStream& ReadGDIMetaFile( SvStream& rIStm, GDIMetaFile& rGDIMetaFile )
pCompat.reset(); // destructor writes stuff into the header pCompat.reset(); // destructor writes stuff into the header
ImplMetaReadData aReadData; std::unique_ptr<ImplMetaReadData> xReadData;
aReadData.meActualCharSet = rIStm.GetStreamCharSet(); if (!pData)
{
xReadData.reset(new ImplMetaReadData);
pData = xReadData.get();
}
DepthGuard aDepthGuard(*pData, rIStm);
if (aDepthGuard.TooDeep())
throw std::runtime_error("too much recursion");
for( sal_uInt32 nAction = 0UL; ( nAction < nCount ) && !rIStm.IsEof(); nAction++ ) for( sal_uInt32 nAction = 0UL; ( nAction < nCount ) && !rIStm.IsEof(); nAction++ )
{ {
MetaAction* pAction = MetaAction::ReadMetaAction( rIStm, &aReadData ); MetaAction* pAction = MetaAction::ReadMetaAction(rIStm, pData);
if( pAction ) if( pAction )
{ {
if (pAction->GetType() == MetaActionType::COMMENT) if (pAction->GetType() == MetaActionType::COMMENT)
......
...@@ -3046,10 +3046,10 @@ void MetaFloatTransparentAction::Write( SvStream& rOStm, ImplMetaWriteData* pDat ...@@ -3046,10 +3046,10 @@ void MetaFloatTransparentAction::Write( SvStream& rOStm, ImplMetaWriteData* pDat
WriteGradient( rOStm, maGradient ); WriteGradient( rOStm, maGradient );
} }
void MetaFloatTransparentAction::Read( SvStream& rIStm, ImplMetaReadData* ) void MetaFloatTransparentAction::Read(SvStream& rIStm, ImplMetaReadData* pData)
{ {
VersionCompat aCompat(rIStm, StreamMode::READ); VersionCompat aCompat(rIStm, StreamMode::READ);
ReadGDIMetaFile( rIStm, maMtf ); ReadGDIMetaFile(rIStm, maMtf, pData);
ReadPair( rIStm, maPoint ); ReadPair( rIStm, maPoint );
ReadPair( rIStm, maSize ); ReadPair( rIStm, maSize );
ReadGradient( rIStm, maGradient ); ReadGradient( rIStm, maGradient );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment