filter/source/msfilter/svdfppt.cxx | 45 +++++++++++++++------------------ include/filter/msfilter/dffpropset.hxx | 1 sd/qa/unit/data/ppt/pass/hang-3.ppt |binary sd/source/filter/ppt/pptin.cxx | 35 +++++++++++++++---------- 4 files changed, 43 insertions(+), 38 deletions(-)
New commits: commit 016ae98411175c123f0f20057fff9afee7b53359 Author: Caolán McNamara <caol...@redhat.com> Date: Thu Aug 27 09:13:42 2015 +0100 extend seek, loop ending tests to ppt specific code (cherry picked from commit c249f93d96ec87b0acbd25ffe087543d6fe9fb14) Change-Id: Id4419b6b902b742117e248870b6a663c9c58955f Reviewed-on: https://gerrit.libreoffice.org/18053 Reviewed-by: David Tardon <dtar...@redhat.com> Tested-by: David Tardon <dtar...@redhat.com> diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx index 0942060..9a5ca61 100644 --- a/filter/source/msfilter/svdfppt.cxx +++ b/filter/source/msfilter/svdfppt.cxx @@ -706,19 +706,16 @@ void SdrEscherImport::RecolorGraphic( SvStream& rSt, sal_uInt32 nRecLen, Graphic } } -namespace +sal_uLong DffPropSet::SanitizeEndPos(SvStream &rIn, sal_uLong nEndRecPos) { - sal_uLong SanitizeEndPos(SvStream &rIn, sal_uLong nEndRecPos) + auto nStreamLen = rIn.Tell() + rIn.remainingSize(); + if (nEndRecPos > nStreamLen) { - auto nStreamLen = rIn.Tell() + rIn.remainingSize(); - if (nEndRecPos > nStreamLen) - { - SAL_WARN("filter.ms", "Parsing error: " << nStreamLen << - " max end pos, but " << nEndRecPos << " claimed, truncating"); - nEndRecPos = nStreamLen; - } - return nEndRecPos; + SAL_WARN("filter.ms", "Parsing error: " << nStreamLen << + " max end pos, but " << nEndRecPos << " claimed, truncating"); + nEndRecPos = nStreamLen; } + return nEndRecPos; } /* ProcessObject is called from ImplSdPPTImport::ProcessObj to handle all application specific things, @@ -2650,7 +2647,7 @@ void ImportComment10( SvxMSDffManager& rMan, SvStream& rStCtrl, SdrPage* pPage, sal_Int32 nPosY = 0; - auto nEndRecPos = SanitizeEndPos(rStCtrl, rComment10Hd.GetRecEndFilePos()); + auto nEndRecPos = DffPropSet::SanitizeEndPos(rStCtrl, rComment10Hd.GetRecEndFilePos()); while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < nEndRecPos ) ) { DffRecordHeader aCommentHd; @@ -3192,7 +3189,7 @@ PPTExtParaProv::PPTExtParaProv( SdrPowerPointImport& rMan, SvStream& rSt, const pListHd->SeekToContent( rSt ); if ( !rMan.SeekToContentOfProgTag( 9, rSt, *pListHd, aContentDataHd ) ) break; - auto nEndRecPos = SanitizeEndPos(rSt, aContentDataHd.GetRecEndFilePos()); + auto nEndRecPos = DffPropSet::SanitizeEndPos(rSt, aContentDataHd.GetRecEndFilePos()); while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < nEndRecPos ) ) { ReadDffRecordHeader( rSt, aHd ); @@ -3200,7 +3197,7 @@ PPTExtParaProv::PPTExtParaProv( SdrPowerPointImport& rMan, SvStream& rSt, const { case PPT_PST_ExtendedBuGraContainer : { - auto nHdEndRecPos = SanitizeEndPos(rSt, aHd.GetRecEndFilePos()); + auto nHdEndRecPos = DffPropSet::SanitizeEndPos(rSt, aHd.GetRecEndFilePos()); while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < nHdEndRecPos ) ) { sal_uInt16 nType; @@ -3275,7 +3272,7 @@ PPTExtParaProv::PPTExtParaProv( SdrPowerPointImport& rMan, SvStream& rSt, const { // get the extended paragraph styles on mainmaster ( graphical bullets, num ruling ... ) if ( !rMan.SeekToContentOfProgTag( 9, rSt, *pHd, aContentDataHd ) ) break; - auto nEndRecPos = SanitizeEndPos(rSt, aContentDataHd.GetRecEndFilePos()); + auto nEndRecPos = DffPropSet::SanitizeEndPos(rSt, aContentDataHd.GetRecEndFilePos()); while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < nEndRecPos ) ) { ReadDffRecordHeader( rSt, aHd ); @@ -3289,7 +3286,7 @@ PPTExtParaProv::PPTExtParaProv( SdrPowerPointImport& rMan, SvStream& rSt, const rSt.ReadUInt16( nDepth ); if ( i <= 5 ) { - auto nHdEndRecPos = SanitizeEndPos(rSt, aHd.GetRecEndFilePos()); + auto nHdEndRecPos = DffPropSet::SanitizeEndPos(rSt, aHd.GetRecEndFilePos()); while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < nHdEndRecPos ) && ( i < nDepth ) ) { bStyles = true; @@ -4052,7 +4049,7 @@ PPTStyleSheet::PPTStyleSheet( const DffRecordHeader& rSlideHd, SvStream& rIn, Sd { pEnvHeader->SeekToContent( rIn ); DffRecordHeader aTxMasterStyleHd; - auto nEndRecPos = SanitizeEndPos(rIn, pEnvHeader->GetRecEndFilePos()); + auto nEndRecPos = DffPropSet::SanitizeEndPos(rIn, pEnvHeader->GetRecEndFilePos()); while (rIn.Tell() < nEndRecPos) { ReadDffRecordHeader( rIn, aTxMasterStyleHd ); @@ -4064,7 +4061,7 @@ PPTStyleSheet::PPTStyleSheet( const DffRecordHeader& rSlideHd, SvStream& rIn, Sd sal_uInt16 nLev = 0; bool bFirst = true; bFoundTxMasterStyleAtom04 = true; - auto nTxEndRecPos = SanitizeEndPos(rIn, aTxMasterStyleHd.GetRecEndFilePos()); + auto nTxEndRecPos = DffPropSet::SanitizeEndPos(rIn, aTxMasterStyleHd.GetRecEndFilePos()); while (rIn.GetError() == 0 && rIn.Tell() < nTxEndRecPos && nLev < nLevelAnz && nLev < nMaxPPTLevels) { if ( nLev ) @@ -4103,7 +4100,7 @@ PPTStyleSheet::PPTStyleSheet( const DffRecordHeader& rSlideHd, SvStream& rIn, Sd rSlideHd.SeekToContent( rIn ); DffRecordHeader aTxMasterStyleHd; - auto nEndRecPos = SanitizeEndPos(rIn, rSlideHd.GetRecEndFilePos()); + auto nEndRecPos = DffPropSet::SanitizeEndPos(rIn, rSlideHd.GetRecEndFilePos()); while (rIn.Tell() < nEndRecPos) { ReadDffRecordHeader( rIn, aTxMasterStyleHd ); @@ -4162,7 +4159,7 @@ PPTStyleSheet::PPTStyleSheet( const DffRecordHeader& rSlideHd, SvStream& rIn, Sd sal_uInt16 nLev = 0; bool bFirst = true; - auto nTxEndRecPos = SanitizeEndPos(rIn, aTxMasterStyleHd.GetRecEndFilePos()); + auto nTxEndRecPos = DffPropSet::SanitizeEndPos(rIn, aTxMasterStyleHd.GetRecEndFilePos()); while ( rIn.GetError() == 0 && rIn.Tell() < nTxEndRecPos && nLev < nLevelAnz ) { if ( nLev && ( nInstance < 5 ) ) @@ -4242,7 +4239,7 @@ PPTStyleSheet::PPTStyleSheet( const DffRecordHeader& rSlideHd, SvStream& rIn, Sd { pEnvHeader2->SeekToContent( rIn ); DffRecordHeader aTxMasterStyleHd2; - auto nEnvEndRecPos = SanitizeEndPos(rIn, pEnvHeader2->GetRecEndFilePos()); + auto nEnvEndRecPos = DffPropSet::SanitizeEndPos(rIn, pEnvHeader2->GetRecEndFilePos()); while (rIn.Tell() < nEnvEndRecPos) { ReadDffRecordHeader( rIn, aTxMasterStyleHd2 ); @@ -4253,7 +4250,7 @@ PPTStyleSheet::PPTStyleSheet( const DffRecordHeader& rSlideHd, SvStream& rIn, Sd sal_uInt16 nLev = 0; bool bFirst = true; - auto nTxEndRecPos = SanitizeEndPos(rIn, aTxMasterStyleHd2.GetRecEndFilePos()); + auto nTxEndRecPos = DffPropSet::SanitizeEndPos(rIn, aTxMasterStyleHd2.GetRecEndFilePos()); while ( rIn.GetError() == 0 && rIn.Tell() < nTxEndRecPos && nLev < nLevelAnz ) { if ( nLev ) @@ -4771,7 +4768,7 @@ bool PPTTextSpecInfoAtomInterpreter::Read( SvStream& rIn, const DffRecordHeader& sal_uInt32 nCharIdx = 0; rRecHd.SeekToContent( rIn ); - auto nEndRecPos = SanitizeEndPos(rIn, rRecHd.GetRecEndFilePos()); + auto nEndRecPos = DffPropSet::SanitizeEndPos(rIn, rRecHd.GetRecEndFilePos()); while (rIn.Tell() < nEndRecPos && rIn.good()) { if ( nRecordType == PPT_PST_TextSpecInfoAtom ) @@ -5111,7 +5108,7 @@ void PPTStyleTextPropReader::Init( SvStream& rIn, SdrPowerPointImport& rMan, con { rIn.Seek( rExtParaHd.nFilePos + 8 ); - auto nEndRecPos = SanitizeEndPos(rIn, rExtParaHd.GetRecEndFilePos()); + auto nEndRecPos = DffPropSet::SanitizeEndPos(rIn, rExtParaHd.GetRecEndFilePos()); while( ( rIn.GetError() == 0 ) && ( rIn.Tell() < nEndRecPos ) ) { aStyleTextProp9.resize( aStyleTextProp9.size() + 1 ); @@ -6631,7 +6628,7 @@ PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport // or ParaTabStops and append them on this textobj rIn.Seek( nFilePos ); ::std::vector< PPTFieldEntry* > FieldList; - auto nEndRecPos = SanitizeEndPos(rIn, aClientTextBoxHd.GetRecEndFilePos()); + auto nEndRecPos = DffPropSet::SanitizeEndPos(rIn, aClientTextBoxHd.GetRecEndFilePos()); while (rIn.Tell() < nEndRecPos) { ReadDffRecordHeader( rIn, aTextHd ); diff --git a/include/filter/msfilter/dffpropset.hxx b/include/filter/msfilter/dffpropset.hxx index 19f7749..db80e9b 100644 --- a/include/filter/msfilter/dffpropset.hxx +++ b/include/filter/msfilter/dffpropset.hxx @@ -60,6 +60,7 @@ class MSFILTER_DLLPUBLIC DffPropSet OUString GetPropertyString( sal_uInt32 nId, SvStream& rStrm ) const; bool SeekToContent( sal_uInt32 nRecType, SvStream& rSt ) const; void InitializePropSet( sal_uInt16 nPropSetType ) const; + static sal_uLong SanitizeEndPos(SvStream &rIn, sal_uLong nEndRecPos); friend SvStream& ReadDffPropSet( SvStream& rIn, DffPropSet& rPropSet ); friend SvStream& operator|=( SvStream& rIn, DffPropSet& rPropSet ); diff --git a/sd/qa/unit/data/ppt/pass/hang-3.ppt b/sd/qa/unit/data/ppt/pass/hang-3.ppt new file mode 100644 index 0000000..156a9d0 Binary files /dev/null and b/sd/qa/unit/data/ppt/pass/hang-3.ppt differ diff --git a/sd/source/filter/ppt/pptin.cxx b/sd/source/filter/ppt/pptin.cxx index 06a89e6..57f1c23 100644 --- a/sd/source/filter/ppt/pptin.cxx +++ b/sd/source/filter/ppt/pptin.cxx @@ -741,7 +741,8 @@ bool ImplSdPPTImport::Import() DffRecordHeader aPageHd; if ( SeekToAktPage( &aPageHd ) ) { - while( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aPageHd.GetRecEndFilePos() ) ) + auto nEndRecPos = SanitizeEndPos(rStCtrl, aPageHd.GetRecEndFilePos()); + while( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < nEndRecPos ) ) { DffRecordHeader aHd; ReadDffRecordHeader( rStCtrl, aHd ); @@ -762,7 +763,8 @@ bool ImplSdPPTImport::Import() if ( SeekToRec( rStCtrl, DFF_msofbtSpgrContainer, nEscherF002End, &aEscherObjListHd ) ) { sal_uInt32 nObjCount = 0; - while( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aEscherObjListHd.GetRecEndFilePos() ) ) + auto nListEndRecPos = SanitizeEndPos(rStCtrl, aEscherObjListHd.GetRecEndFilePos()); + while( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < nListEndRecPos ) ) { DffRecordHeader aHd2; ReadDffRecordHeader( rStCtrl, aHd2 ); @@ -793,7 +795,8 @@ bool ImplSdPPTImport::Import() DffRecordHeader aProgTagHd; if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) ) { - while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aProgTagHd.GetRecEndFilePos() ) ) + auto nTagEndRecPos = SanitizeEndPos(rStCtrl, aProgTagHd.GetRecEndFilePos()); + while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < nTagEndRecPos ) ) { DffRecordHeader aProgTagContentHd; ReadDffRecordHeader( rStCtrl, aProgTagContentHd ); @@ -901,7 +904,8 @@ bool ImplSdPPTImport::Import() if ( SeekToAktPage( &aPageHd ) ) { aPageHd.SeekToContent( rStCtrl ); - while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aPageHd.GetRecEndFilePos() ) ) + auto nEndRecPos = SanitizeEndPos(rStCtrl, aPageHd.GetRecEndFilePos()); + while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < nEndRecPos ) ) { DffRecordHeader aHd; ReadDffRecordHeader( rStCtrl, aHd ); @@ -912,7 +916,8 @@ bool ImplSdPPTImport::Import() DffRecordHeader aProgTagHd; if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) ) { - while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aProgTagHd.GetRecEndFilePos() ) ) + auto nHdEndRecPos = SanitizeEndPos(rStCtrl, aProgTagHd.GetRecEndFilePos()); + while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < nHdEndRecPos ) ) { DffRecordHeader aProgTagContentHd; ReadDffRecordHeader( rStCtrl, aProgTagContentHd ); @@ -1488,7 +1493,7 @@ void ImplSdPPTImport::ImportPageEffect( SdPage* pPage, const bool bNewAnimations DffRecordHeader aPageRecHd; if ( SeekToAktPage( &aPageRecHd ) ) { - sal_uLong nPageRecEnd = aPageRecHd.GetRecEndFilePos(); + sal_uLong nPageRecEnd = SanitizeEndPos(rStCtrl, aPageRecHd.GetRecEndFilePos()); bool bTryTwice = ( eAktPageKind == PPT_SLIDEPAGE ); bool bSSSlideInfoAtom = false; @@ -1781,12 +1786,12 @@ void ImplSdPPTImport::ImportPageEffect( SdPage* pPage, const bool bNewAnimations assert( !pPageList->is_null( nMasterNum ) ); const PptSlidePersistEntry& rE = (*pPageList)[ nMasterNum ]; sal_uInt32 nOfs = rE.aPersistAtom.nReserved; - if ( nOfs ) - { - rStCtrl.Seek( nOfs ); - nPageRecEnd = nOfs + 16; - continue; - } + if ( nOfs ) + { + rStCtrl.Seek( nOfs ); + nPageRecEnd = nOfs + 16; + continue; + } } } @@ -1945,7 +1950,8 @@ OUString ImplSdPPTImport::ReadMedia( sal_uInt32 nMediaRef ) const if ( pHd ) { pHd->SeekToContent( rStCtrl ); - while ( ( rStCtrl.Tell() < pHd->GetRecEndFilePos() ) && aRetVal.isEmpty() ) + auto nEndRecPos = SanitizeEndPos(rStCtrl, pHd->GetRecEndFilePos()); + while ( ( rStCtrl.Tell() < nEndRecPos ) && aRetVal.isEmpty() ) { DffRecordHeader aHdMovie; ReadDffRecordHeader( rStCtrl, aHdMovie ); @@ -1965,7 +1971,8 @@ OUString ImplSdPPTImport::ReadMedia( sal_uInt32 nMediaRef ) const if ( nRef == nMediaRef ) { aExVideoHd.SeekToContent( rStCtrl ); - while( rStCtrl.Tell() < aExVideoHd.GetRecEndFilePos() ) + auto nHdEndRecPos = SanitizeEndPos(rStCtrl, aExVideoHd.GetRecEndFilePos()); + while (rStCtrl.Tell() < nHdEndRecPos) { DffRecordHeader aHd; ReadDffRecordHeader( rStCtrl, aHd );
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits