summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-08-31 20:43:29 +0100
committerCaolán McNamara <caolanm@redhat.com>2015-09-01 09:40:20 +0100
commit239c25ff95b665717e87f3e4cf5aa6c29e4deb72 (patch)
tree11d11271d8fd8477f646f463b461d029b3cb376e /filter
parent31657493553b8b9bc6db06ee0df3c0e585eeec1b (diff)
check for error more frequently
Change-Id: I909c225dd9bd92763ae24b62854a9217fc2e2a0e
Diffstat (limited to 'filter')
-rw-r--r--filter/source/msfilter/dffrecordheader.cxx4
-rw-r--r--filter/source/msfilter/msdffimp.cxx108
-rw-r--r--filter/source/msfilter/svdfppt.cxx12
3 files changed, 70 insertions, 54 deletions
diff --git a/filter/source/msfilter/dffrecordheader.cxx b/filter/source/msfilter/dffrecordheader.cxx
index 232e2cf7c0e0..e0adfe9460f0 100644
--- a/filter/source/msfilter/dffrecordheader.cxx
+++ b/filter/source/msfilter/dffrecordheader.cxx
@@ -19,7 +19,7 @@
#include <filter/msfilter/dffrecordheader.hxx>
-SvStream& ReadDffRecordHeader( SvStream& rIn, DffRecordHeader& rRec )
+bool ReadDffRecordHeader( SvStream& rIn, DffRecordHeader& rRec )
{
rRec.nFilePos = rIn.Tell();
sal_uInt16 nTmp(0);
@@ -35,7 +35,7 @@ SvStream& ReadDffRecordHeader( SvStream& rIn, DffRecordHeader& rRec )
if ( rRec.nRecLen > ( SAL_MAX_UINT32 - rRec.nFilePos ) )
rIn.SetError( SVSTREAM_FILEFORMAT_ERROR );
- return rIn;
+ return rIn.good();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 6c723a80a65c..e334400850d0 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -226,8 +226,8 @@ void DffPropertyReader::SetDefaultPropSet( SvStream& rStCtrl, sal_uInt32 nOffsDg
sal_uInt32 nMerk = rStCtrl.Tell();
rStCtrl.Seek( nOffsDgg );
DffRecordHeader aRecHd;
- ReadDffRecordHeader( rStCtrl, aRecHd );
- if ( aRecHd.nRecType == DFF_msofbtDggContainer )
+ bool bOk = ReadDffRecordHeader( rStCtrl, aRecHd );
+ if (bOk && aRecHd.nRecType == DFF_msofbtDggContainer)
{
if ( SvxMSDffManager::SeekToRec( rStCtrl, DFF_msofbtOPT, aRecHd.GetRecEndFilePos() ) )
{
@@ -252,8 +252,8 @@ void DffPropertyReader::ReadPropSet( SvStream& rIn, void* pClientData ) const
if ( rManager.SeekToShape( rIn, pClientData, GetPropertyValue( DFF_Prop_hspMaster, 0 ) ) )
{
DffRecordHeader aRecHd;
- ReadDffRecordHeader( rIn, aRecHd );
- if ( SvxMSDffManager::SeekToRec( rIn, DFF_msofbtOPT, aRecHd.GetRecEndFilePos() ) )
+ bool bOk = ReadDffRecordHeader(rIn, aRecHd);
+ if (bOk && SvxMSDffManager::SeekToRec(rIn, DFF_msofbtOPT, aRecHd.GetRecEndFilePos()))
{
rIn |= (DffPropertyReader&)*this;
}
@@ -406,14 +406,15 @@ SvxMSDffSolverContainer::~SvxMSDffSolverContainer()
SvStream& ReadSvxMSDffSolverContainer( SvStream& rIn, SvxMSDffSolverContainer& rContainer )
{
DffRecordHeader aHd;
- ReadDffRecordHeader( rIn, aHd );
- if ( aHd.nRecType == DFF_msofbtSolverContainer )
+ bool bOk = ReadDffRecordHeader( rIn, aHd );
+ if (bOk && aHd.nRecType == DFF_msofbtSolverContainer)
{
DffRecordHeader aCRule;
auto nEndPos = DffPropSet::SanitizeEndPos(rIn, aHd.GetRecEndFilePos());
- while ( ( rIn.GetError() == 0 ) && ( rIn.Tell() < nEndPos ) )
+ while ( rIn.good() && ( rIn.Tell() < nEndPos ) )
{
- ReadDffRecordHeader( rIn, aCRule );
+ if (!ReadDffRecordHeader(rIn, aCRule))
+ break;
if ( aCRule.nRecType == DFF_msofbtConnectorRule )
{
SvxMSDffConnectorRule* pRule = new SvxMSDffConnectorRule;
@@ -2939,8 +2940,8 @@ void DffRecordManager::Consume( SvStream& rIn, bool bAppend, sal_uInt32 nStOfs )
if ( !nStOfs )
{
DffRecordHeader aHd;
- ReadDffRecordHeader( rIn, aHd );
- if ( aHd.nRecVer == DFF_PSFLAG_CONTAINER )
+ bool bOk = ReadDffRecordHeader( rIn, aHd );
+ if (bOk && aHd.nRecVer == DFF_PSFLAG_CONTAINER)
nStOfs = aHd.GetRecEndFilePos();
}
if ( nStOfs )
@@ -2948,11 +2949,12 @@ void DffRecordManager::Consume( SvStream& rIn, bool bAppend, sal_uInt32 nStOfs )
pCList = static_cast<DffRecordList*>(this);
while ( pCList->pNext )
pCList = pCList->pNext;
- while ( ( rIn.GetError() == 0 ) && ( ( rIn.Tell() + 8 ) <= nStOfs ) )
+ while (rIn.good() && ( ( rIn.Tell() + 8 ) <= nStOfs ))
{
if ( pCList->nCount == DFF_RECORD_MANAGER_BUF_SIZE )
pCList = new DffRecordList( pCList );
- ReadDffRecordHeader( rIn, pCList->mHd[ pCList->nCount ] );
+ if (!ReadDffRecordHeader(rIn, pCList->mHd[ pCList->nCount ]))
+ break;
bool bSeekSucceeded = pCList->mHd[ pCList->nCount++ ].SeekToEndOfRecord(rIn);
if (!bSeekSucceeded)
break;
@@ -3212,12 +3214,13 @@ bool SvxMSDffManager::SeekToShape( SvStream& rSt, void* /* pClientData */, sal_u
sal_IntPtr nOfs = it->second;
rSt.Seek( nOfs );
DffRecordHeader aEscherF002Hd;
- ReadDffRecordHeader( rSt, aEscherF002Hd );
- sal_uLong nEscherF002End = aEscherF002Hd.GetRecEndFilePos();
- DffRecordHeader aEscherObjListHd;
+ bool bOk = ReadDffRecordHeader( rSt, aEscherF002Hd );
+ sal_uLong nEscherF002End = bOk ? aEscherF002Hd.GetRecEndFilePos() : 0;
while (rSt.good() && rSt.Tell() < nEscherF002End)
{
- ReadDffRecordHeader( rSt, aEscherObjListHd );
+ DffRecordHeader aEscherObjListHd;
+ if (!ReadDffRecordHeader(rSt, aEscherObjListHd))
+ break;
if ( aEscherObjListHd.nRecVer != 0xf )
aEscherObjListHd.SeekToEndOfRecord( rSt );
else if ( aEscherObjListHd.nRecType == DFF_msofbtSpContainer )
@@ -3248,11 +3251,10 @@ bool SvxMSDffManager::SeekToRec( SvStream& rSt, sal_uInt16 nRecId, sal_uLong nMa
{
bool bRet = false;
sal_uLong nFPosMerk = rSt.Tell(); // store FilePos to restore it later if necessary
- DffRecordHeader aHd;
do
{
- ReadDffRecordHeader( rSt, aHd );
- if (!rSt.good())
+ DffRecordHeader aHd;
+ if (!ReadDffRecordHeader(rSt, aHd))
break;
if (aHd.nRecLen > nMaxLegalDffRecordLength)
break;
@@ -3293,10 +3295,11 @@ bool SvxMSDffManager::SeekToRec2( sal_uInt16 nRecId1, sal_uInt16 nRecId2, sal_uL
{
bool bRet = false;
sal_uLong nFPosMerk = rStCtrl.Tell(); // remember FilePos for conditionally later restoration
- DffRecordHeader aHd;
do
{
- ReadDffRecordHeader( rStCtrl, aHd );
+ DffRecordHeader aHd;
+ if (!ReadDffRecordHeader(rStCtrl, aHd))
+ break;
if ( aHd.nRecType == nRecId1 || aHd.nRecType == nRecId2 )
{
if ( nSkipCount )
@@ -3591,13 +3594,15 @@ Color SvxMSDffManager::MSO_CLR_ToColor( sal_uInt32 nColorCode, sal_uInt16 nConte
void SvxMSDffManager::ReadObjText( SvStream& rStream, SdrObject* pObj )
{
DffRecordHeader aRecHd;
- ReadDffRecordHeader( rStream, aRecHd );
+ if (!ReadDffRecordHeader(rStream, aRecHd))
+ return;
if( aRecHd.nRecType == DFF_msofbtClientTextbox || aRecHd.nRecType == 0x1022 )
{
- while( rStream.GetError() == 0 && rStream.Tell() < aRecHd.GetRecEndFilePos() )
+ while (rStream.good() && rStream.Tell() < aRecHd.GetRecEndFilePos())
{
DffRecordHeader aHd;
- ReadDffRecordHeader( rStream, aHd );
+ if (!ReadDffRecordHeader(rStream, aHd))
+ break;
switch( aHd.nRecType )
{
case DFF_PST_TextBytesAtom:
@@ -3800,8 +3805,8 @@ SdrObject* SvxMSDffManager::ImportGraphic( SvStream& rSt, SfxItemSet& rSet, cons
*/
rObjData.rSpHd.SeekToEndOfRecord( rSt );
DffRecordHeader aHd;
- ReadDffRecordHeader( rSt, aHd );
- if( DFF_msofbtBSE == aHd.nRecType )
+ bool bOk = ReadDffRecordHeader(rSt, aHd);
+ if (bOk && DFF_msofbtBSE == aHd.nRecType)
{
const sal_uLong nSkipBLIPLen = 20;
const sal_uLong nSkipShapePos = 4;
@@ -4027,12 +4032,12 @@ SdrObject* SvxMSDffManager::ImportObj( SvStream& rSt, void* pClientData,
{
SdrObject* pRet = NULL;
DffRecordHeader aObjHd;
- ReadDffRecordHeader( rSt, aObjHd );
- if ( aObjHd.nRecType == DFF_msofbtSpgrContainer )
+ bool bOk = ReadDffRecordHeader(rSt, aObjHd);
+ if (bOk && aObjHd.nRecType == DFF_msofbtSpgrContainer)
{
pRet = ImportGroup( aObjHd, rSt, pClientData, rClientRect, rGlobalChildRect, nCalledByGroup, pShapeId );
}
- else if ( aObjHd.nRecType == DFF_msofbtSpContainer )
+ else if (bOk && aObjHd.nRecType == DFF_msofbtSpContainer)
{
pRet = ImportShape( aObjHd, rSt, pClientData, rClientRect, rGlobalChildRect, nCalledByGroup, pShapeId );
}
@@ -4053,8 +4058,8 @@ SdrObject* SvxMSDffManager::ImportGroup( const DffRecordHeader& rHd, SvStream& r
return pRet;
DffRecordHeader aRecHd; // the first atom has to be the SpContainer for the GroupObject
- ReadDffRecordHeader( rSt, aRecHd );
- if ( aRecHd.nRecType == DFF_msofbtSpContainer )
+ bool bOk = ReadDffRecordHeader(rSt, aRecHd);
+ if (bOk && aRecHd.nRecType == DFF_msofbtSpContainer)
{
mnFix16Angle = 0;
if (!aRecHd.SeekToBegOfRecord(rSt))
@@ -4092,10 +4097,11 @@ SdrObject* SvxMSDffManager::ImportGroup( const DffRecordHeader& rHd, SvStream& r
if (!aRecHd.SeekToEndOfRecord(rSt))
return pRet;
- while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < rHd.GetRecEndFilePos() ) )
+ while (rSt.good() && ( rSt.Tell() < rHd.GetRecEndFilePos()))
{
DffRecordHeader aRecHd2;
- ReadDffRecordHeader( rSt, aRecHd2 );
+ if (!ReadDffRecordHeader(rSt, aRecHd2))
+ break;
if ( aRecHd2.nRecType == DFF_msofbtSpgrContainer )
{
Rectangle aGroupClientAnchor, aGroupChildAnchor;
@@ -4836,17 +4842,19 @@ Rectangle SvxMSDffManager::GetGlobalChildAnchor( const DffRecordHeader& rHd, SvS
while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < rHd.GetRecEndFilePos() ) )
{
DffRecordHeader aShapeHd;
- ReadDffRecordHeader( rSt, aShapeHd );
+ if (!ReadDffRecordHeader(rSt, aShapeHd))
+ break;
if ( ( aShapeHd.nRecType == DFF_msofbtSpContainer ) ||
( aShapeHd.nRecType == DFF_msofbtSpgrContainer ) )
{
DffRecordHeader aShapeHd2( aShapeHd );
if ( aShapeHd.nRecType == DFF_msofbtSpgrContainer )
ReadDffRecordHeader( rSt, aShapeHd2 );
- while( ( rSt.GetError() == 0 ) && ( rSt.Tell() < aShapeHd2.GetRecEndFilePos() ) )
+ while (rSt.good() && rSt.Tell() < aShapeHd2.GetRecEndFilePos())
{
DffRecordHeader aShapeAtom;
- ReadDffRecordHeader( rSt, aShapeAtom );
+ if (!ReadDffRecordHeader(rSt, aShapeAtom))
+ break;
if ( aShapeAtom.nRecType == DFF_msofbtClientAnchor )
{
@@ -4911,19 +4919,21 @@ void SvxMSDffManager::GetGroupAnchors( const DffRecordHeader& rHd, SvStream& rSt
bool bFirst = true;
DffRecordHeader aShapeHd;
- while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < rHd.GetRecEndFilePos() ) )
+ while (rSt.good() && rSt.Tell() < rHd.GetRecEndFilePos())
{
- ReadDffRecordHeader( rSt, aShapeHd );
+ if (!ReadDffRecordHeader(rSt, aShapeHd))
+ break;
if ( ( aShapeHd.nRecType == DFF_msofbtSpContainer ) ||
( aShapeHd.nRecType == DFF_msofbtSpgrContainer ) )
{
DffRecordHeader aShapeHd2( aShapeHd );
if ( aShapeHd.nRecType == DFF_msofbtSpgrContainer )
ReadDffRecordHeader( rSt, aShapeHd2 );
- while( ( rSt.GetError() == 0 ) && ( rSt.Tell() < aShapeHd2.GetRecEndFilePos() ) )
+ while (rSt.good() && rSt.Tell() < aShapeHd2.GetRecEndFilePos())
{
DffRecordHeader aShapeAtom;
- ReadDffRecordHeader( rSt, aShapeAtom );
+ if (!ReadDffRecordHeader(rSt, aShapeAtom))
+ break;
if ( aShapeAtom.nRecType == DFF_msofbtChildAnchor )
{
sal_Int32 l, o, r, u;
@@ -5669,16 +5679,18 @@ void SvxMSDffManager::SetDgContainer( SvStream& rSt )
{
sal_uInt32 nFilePos = rSt.Tell();
DffRecordHeader aDgContHd;
- ReadDffRecordHeader( rSt, aDgContHd );
+ bool bOk = ReadDffRecordHeader(rSt, aDgContHd);
// insert this container only if there is also a DggAtom
- if ( SeekToRec( rSt, DFF_msofbtDg, aDgContHd.GetRecEndFilePos() ) )
+ if (bOk && SeekToRec(rSt, DFF_msofbtDg, aDgContHd.GetRecEndFilePos()))
{
DffRecordHeader aRecHd;
- ReadDffRecordHeader( rSt, aRecHd );
- sal_uInt32 nDrawingId = aRecHd.nRecInstance;
- maDgOffsetTable[ nDrawingId ] = nFilePos;
- rSt.Seek( nFilePos );
+ if (ReadDffRecordHeader(rSt, aRecHd))
+ {
+ sal_uInt32 nDrawingId = aRecHd.nRecInstance;
+ maDgOffsetTable[nDrawingId] = nFilePos;
+ }
}
+ rSt.Seek(nFilePos);
}
void SvxMSDffManager::GetFidclData( sal_uInt32 nOffsDggL )
@@ -5691,10 +5703,10 @@ void SvxMSDffManager::GetFidclData( sal_uInt32 nOffsDggL )
if (nOffsDggL == rStCtrl.Seek(nOffsDggL))
{
DffRecordHeader aRecHd;
- ReadDffRecordHeader( rStCtrl, aRecHd );
+ bool bOk = ReadDffRecordHeader(rStCtrl, aRecHd);
DffRecordHeader aDggAtomHd;
- if ( SeekToRec( rStCtrl, DFF_msofbtDgg, aRecHd.GetRecEndFilePos(), &aDggAtomHd ) )
+ if (bOk && SeekToRec(rStCtrl, DFF_msofbtDgg, aRecHd.GetRecEndFilePos(), &aDggAtomHd))
{
aDggAtomHd.SeekToContent( rStCtrl );
rStCtrl.ReadUInt32( mnCurMaxShapeId )
diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx
index 744b5e91553b..561ac508d576 100644
--- a/filter/source/msfilter/svdfppt.cxx
+++ b/filter/source/msfilter/svdfppt.cxx
@@ -189,7 +189,8 @@ void PptSlidePersistAtom::Clear()
SvStream& ReadPptSlidePersistAtom( SvStream& rIn, PptSlidePersistAtom& rAtom )
{
DffRecordHeader aHd;
- ReadDffRecordHeader( rIn, aHd )
+ ReadDffRecordHeader( rIn, aHd );
+ rIn
.ReadUInt32( rAtom.nPsrReference )
.ReadUInt32( rAtom.nFlags )
.ReadUInt32( rAtom.nNumberTexts )
@@ -266,7 +267,8 @@ SvStream& ReadPptDocumentAtom(SvStream& rIn, PptDocumentAtom& rAtom)
sal_uInt16 nSlidePageFormat;
sal_Int8 nEmbeddedTrueType, nTitlePlaceHoldersOmitted, nRightToLeft, nShowComments;
- ReadDffRecordHeader( rIn, aHd )
+ ReadDffRecordHeader( rIn, aHd );
+ rIn
.ReadInt32( nSlideX ).ReadInt32( nSlideY )
.ReadInt32( nNoticeX ).ReadInt32( nNoticeY )
.ReadInt32( nDummy ).ReadInt32( nDummy ) // skip ZoomRation
@@ -328,7 +330,8 @@ void PptSlideAtom::Clear()
SvStream& ReadPptNotesAtom( SvStream& rIn, PptNotesAtom& rAtom )
{
DffRecordHeader aHd;
- ReadDffRecordHeader( rIn, aHd )
+ ReadDffRecordHeader( rIn, aHd );
+ rIn
.ReadUInt32( rAtom.nSlideId )
.ReadUInt16( rAtom.nFlags );
aHd.SeekToEndOfRecord( rIn );
@@ -456,7 +459,8 @@ class PptFontCollection : public std::vector<std::unique_ptr<PptFontEntityAtom>>
SvStream& ReadPptUserEditAtom( SvStream& rIn, PptUserEditAtom& rAtom )
{
- ReadDffRecordHeader( rIn, rAtom.aHd )
+ ReadDffRecordHeader( rIn, rAtom.aHd );
+ rIn
.ReadInt32( rAtom.nLastSlideID )
.ReadUInt32( rAtom.nVersion )
.ReadUInt32( rAtom.nOffsetLastEdit )