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

forcepoint #27 check region bands loaded from stream for consistency

Change-Id: I92376b5fb4208c78fa25a94d4dd394256793161c
Reviewed-on: https://gerrit.libreoffice.org/51145Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMichael Stahl <mstahl@redhat.com>
üst 216d244c
......@@ -36,6 +36,7 @@ private:
ImplRegionBand* mpLastCheckedBand;
void implReset();
SAL_WARN_UNUSED_RESULT bool CheckConsistency() const;
public:
RegionBand();
......@@ -46,7 +47,7 @@ public:
bool operator==( const RegionBand& rRegionBand ) const;
void load(SvStream& rIStrm);
SAL_WARN_UNUSED_RESULT bool load(SvStream& rIStrm);
void save(SvStream& rIStrm) const;
bool isSingleRectangle() const;
......
......@@ -1586,7 +1586,7 @@ SvStream& ReadRegion(SvStream& rIStrm, vcl::Region& rRegion)
default:
{
RegionBand* pNewRegionBand = new RegionBand();
pNewRegionBand->load(rIStrm);
bool bSuccess = pNewRegionBand->load(rIStrm);
rRegion.mpRegionBand.reset(pNewRegionBand);
if(aCompat.GetVersion() >= 2)
......@@ -1603,6 +1603,12 @@ SvStream& ReadRegion(SvStream& rIStrm, vcl::Region& rRegion)
}
}
if (!bSuccess)
{
SAL_WARN("vcl.gdi", "bad region band");
rRegion.SetNull();
}
break;
}
}
......
......@@ -190,7 +190,7 @@ bool RegionBand::operator==( const RegionBand& rRegionBand ) const
enum StreamEntryType { STREAMENTRY_BANDHEADER, STREAMENTRY_SEPARATION, STREAMENTRY_END };
void RegionBand::load(SvStream& rIStrm)
bool RegionBand::load(SvStream& rIStrm)
{
// clear this instance data
implReset();
......@@ -203,14 +203,14 @@ void RegionBand::load(SvStream& rIStrm)
rIStrm.ReadUInt16(nTmp16);
if (STREAMENTRY_END == (StreamEntryType)nTmp16)
return;
return false;
size_t nRecordsPossible = rIStrm.remainingSize() / (2*sizeof(sal_Int32));
if (!nRecordsPossible)
{
OSL_ENSURE(false, "premature end of region stream" );
implReset();
return;
return false;
}
do
......@@ -259,13 +259,19 @@ void RegionBand::load(SvStream& rIStrm)
{
OSL_ENSURE(false, "premature end of region stream" );
implReset();
return;
return false;
}
// get next header
rIStrm.ReadUInt16( nTmp16 );
}
while (STREAMENTRY_END != (StreamEntryType)nTmp16 && rIStrm.good());
if (!CheckConsistency())
{
implReset();
return false;
}
return true;
}
void RegionBand::save(SvStream& rOStrm) const
......@@ -1155,6 +1161,19 @@ bool RegionBand::Exclude(const RegionBand& rSource)
return true;
}
bool RegionBand::CheckConsistency() const
{
// look in the band list (don't test first band again!)
const ImplRegionBand* pBand = mpFirstBand->mpNextBand;
while (pBand)
{
if (!pBand->mpFirstSep)
return false;
pBand = pBand->mpNextBand;
}
return true;
}
tools::Rectangle RegionBand::GetBoundRect() const
{
......
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