diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-03-12 14:13:23 +0000 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2019-08-02 14:08:19 +0200 |
commit | 49f56e5b7f94db0269de927c36f649849ea5b99a (patch) | |
tree | 752c5f0d11e5cfb7fc558b28e5c6390f931f7819 | |
parent | forcepoint #21 pop on empty stack (diff) | |
download | core-49f56e5b7f94db0269de927c36f649849ea5b99a.tar.gz core-49f56e5b7f94db0269de927c36f649849ea5b99a.zip |
forcepoint #27 check region bands loaded from stream for consistency
Change-Id: I92376b5fb4208c78fa25a94d4dd394256793161c
Reviewed-on: https://gerrit.libreoffice.org/51145
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Stahl <mstahl@redhat.com>
(cherry picked from commit 2a63eb8ba642b58814f8a78ba65a2c537aa97cdf)
-rw-r--r-- | vcl/inc/regionband.hxx | 3 | ||||
-rw-r--r-- | vcl/source/gdi/region.cxx | 8 | ||||
-rw-r--r-- | vcl/source/gdi/regionband.cxx | 27 |
3 files changed, 32 insertions, 6 deletions
diff --git a/vcl/inc/regionband.hxx b/vcl/inc/regionband.hxx index 91a13ebffcbf..11a19314a2f5 100644 --- a/vcl/inc/regionband.hxx +++ b/vcl/inc/regionband.hxx @@ -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; diff --git a/vcl/source/gdi/region.cxx b/vcl/source/gdi/region.cxx index 48a5cc026031..1148936f0a3e 100644 --- a/vcl/source/gdi/region.cxx +++ b/vcl/source/gdi/region.cxx @@ -1573,7 +1573,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) @@ -1590,6 +1590,12 @@ SvStream& ReadRegion(SvStream& rIStrm, vcl::Region& rRegion) } } + if (!bSuccess) + { + SAL_WARN("vcl.gdi", "bad region band"); + rRegion.SetNull(); + } + break; } } diff --git a/vcl/source/gdi/regionband.cxx b/vcl/source/gdi/regionband.cxx index 44663759e217..f161d4e8c17f 100644 --- a/vcl/source/gdi/regionband.cxx +++ b/vcl/source/gdi/regionband.cxx @@ -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; +} + Rectangle RegionBand::GetBoundRect() const { |