summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-08-27 13:00:36 +0100
committerMichael Meeks <michael.meeks@collabora.com>2015-08-28 11:32:05 +0000
commit61542931de7abe69a459f3e59513e330ecf47211 (patch)
treeb1dada2f48fb06e17bd25fe2e733eca72caab23d
parenta7fd3a06834900c449448f21624f03edc7b27dda (diff)
check for stream status after a read, not after a seek
Change-Id: I984e99c1a1484547aa4d60bf301167f3cbc9f716 (cherry picked from commit eea399ddd52a0de368321963bb828bc15632dd0b) Reviewed-on: https://gerrit.libreoffice.org/18088 Reviewed-by: Michael Meeks <michael.meeks@collabora.com> Tested-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-4.pptbin0 -> 7712 bytes
-rw-r--r--sd/source/filter/ppt/propread.cxx25
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
new file mode 100644
index 000000000000..f5aa24752180
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-4.ppt
Binary files differ
diff --git a/sd/source/filter/ppt/propread.cxx b/sd/source/filter/ppt/propread.cxx
index 036f1f9f54ee..d738eb847b79 100644
--- a/sd/source/filter/ppt/propread.cxx
+++ b/sd/source/filter/ppt/propread.cxx
@@ -319,7 +319,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 );
@@ -329,16 +329,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;
@@ -360,6 +364,7 @@ void Section::Read( SotStorageStream *pStrm )
pStrm->ReadUInt32( nPropType );
nPropSize += 4;
}
+ sal_uInt32 nTemp(0);
switch( nPropType )
{
case VT_UI1 :
@@ -457,11 +462,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 )
{
@@ -503,7 +508,7 @@ void Section::Read( SotStorageStream *pStrm )
AddProperty( 0xffffffff, pBuf, nSize );
delete[] pBuf;
}
- pStrm->Seek( nCurrent );
+ pStrm->Seek(nCurrent);
}
pStrm->Seek( nSecOfs + nSecSize );
}