diff options
author | Caolán McNamara <caolanm@redhat.com> | 2015-08-27 13:00:36 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-08-27 14:45:02 +0100 |
commit | eea399ddd52a0de368321963bb828bc15632dd0b (patch) | |
tree | 444b7b334f992a40359b3ebd0c397f2336cb1a9c /sd | |
parent | 3bc69b1d0d8620afd89a993b5f6bc46a2ff5267f (diff) |
check for stream status after a read, not after a seek
Change-Id: I984e99c1a1484547aa4d60bf301167f3cbc9f716
Diffstat (limited to 'sd')
-rw-r--r-- | sd/qa/unit/data/ppt/pass/hang-4.ppt | bin | 0 -> 7712 bytes | |||
-rw-r--r-- | sd/source/filter/ppt/propread.cxx | 25 |
2 files changed, 15 insertions, 10 deletions
diff --git a/sd/qa/unit/data/ppt/pass/hang-4.ppt b/sd/qa/unit/data/ppt/pass/hang-4.ppt Binary files differnew file mode 100644 index 000000000000..f5aa24752180 --- /dev/null +++ b/sd/qa/unit/data/ppt/pass/hang-4.ppt diff --git a/sd/source/filter/ppt/propread.cxx b/sd/source/filter/ppt/propread.cxx index 2312081f54ec..f8804fd8f601 100644 --- a/sd/source/filter/ppt/propread.cxx +++ b/sd/source/filter/ppt/propread.cxx @@ -306,7 +306,7 @@ bool Section::GetDictionary( Dictionary& rDict ) void Section::Read( SotStorageStream *pStrm ) { - sal_uInt32 i, nSecOfs, nPropType, nPropSize, nCurrent, nVectorCount, nTemp, nStrmSize; + sal_uInt32 i, nSecOfs, nPropSize, nStrmSize; nSecOfs = pStrm->Tell(); pStrm->Seek( STREAM_SEEK_TO_END ); @@ -316,16 +316,20 @@ void Section::Read( SotStorageStream *pStrm ) mnTextEnc = RTL_TEXTENCODING_MS_1252; sal_uInt32 nSecSize(0), nPropCount(0); pStrm->ReadUInt32( nSecSize ).ReadUInt32( nPropCount ); - while (nPropCount-- && pStrm->good()) + while (nPropCount--) { sal_uInt32 nPropId(0), nPropOfs(0); - pStrm->ReadUInt32( nPropId ).ReadUInt32( nPropOfs ); - nCurrent = pStrm->Tell(); - pStrm->Seek( nPropOfs + nSecOfs ); + pStrm->ReadUInt32(nPropId).ReadUInt32(nPropOfs); + if (!pStrm->good()) + break; + auto nCurrent = pStrm->Tell(); + sal_uInt64 nOffset = nPropOfs + nSecOfs; + if (nOffset != pStrm->Seek(nOffset)) + break; if ( nPropId ) // do not read dictionary { - - pStrm->ReadUInt32( nPropType ); + sal_uInt32 nPropType(0), nVectorCount(0); + pStrm->ReadUInt32(nPropType); nPropSize = 4; @@ -347,6 +351,7 @@ void Section::Read( SotStorageStream *pStrm ) pStrm->ReadUInt32( nPropType ); nPropSize += 4; } + sal_uInt32 nTemp(0); switch( nPropType ) { case VT_UI1 : @@ -440,11 +445,11 @@ void Section::Read( SotStorageStream *pStrm ) PropItem aPropItem; if ( GetProperty( 1, aPropItem ) ) { - sal_uInt16 nCodePage; aPropItem.ReadUInt32( nPropType ); if ( nPropType == VT_I2 ) { - aPropItem.ReadUInt16( nCodePage ); + sal_uInt16 nCodePage(0); + aPropItem.ReadUInt16(nCodePage); if ( nCodePage == 1200 ) { @@ -486,7 +491,7 @@ void Section::Read( SotStorageStream *pStrm ) AddProperty( 0xffffffff, pBuf, nSize ); delete[] pBuf; } - pStrm->Seek( nCurrent ); + pStrm->Seek(nCurrent); } pStrm->Seek( nSecOfs + nSecSize ); } |