diff options
author | Michael Stahl <mstahl@redhat.com> | 2017-09-20 12:36:41 +0200 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2017-09-20 13:08:43 +0200 |
commit | adbf0374e92508ff7170cc1bde9ca63de112ca11 (patch) | |
tree | f45bc1f75037b6e9c313e799bf6a4e71b02118df /sc | |
parent | dc97ede7cffbb5ce704602456ba0f560caee22a2 (diff) |
filter,sc: try to prevent potential SeekToEndOfRecord infinite loops
SeekToEndOfRecord() now doesn't seek to EOF if the offset is too large;
break out of loops in the obvious cases where this could be problematic.
But don't use SAL_WARN_UNUSED_RESULT because unfortunately GCC doesn't
allow to explicitly suppress that with a (void) cast.
Change-Id: Ie0211075bf0f4ef271bb26bdfead5fb070875a2b
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/filter/excel/xiescher.cxx | 23 | ||||
-rw-r--r-- | sc/source/filter/inc/xiescher.hxx | 8 |
2 files changed, 16 insertions, 15 deletions
diff --git a/sc/source/filter/excel/xiescher.cxx b/sc/source/filter/excel/xiescher.cxx index fd13897d33d1..3642f86e3e93 100644 --- a/sc/source/filter/excel/xiescher.cxx +++ b/sc/source/filter/excel/xiescher.cxx @@ -3681,7 +3681,7 @@ OUString XclImpDffConverter::ReadHlinkProperty( SvStream& rDffStrm ) const return aString; } -void XclImpDffConverter::ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader ) +bool XclImpDffConverter::ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader ) { std::size_t nEndPos = rDgHeader.GetRecEndFilePos(); bool isBreak(false); @@ -3692,26 +3692,27 @@ void XclImpDffConverter::ProcessDgContainer( SvStream& rDffStrm, const DffRecord switch( aHeader.nRecType ) { case DFF_msofbtSolverContainer: - ProcessSolverContainer( rDffStrm, aHeader ); + isBreak = !ProcessSolverContainer( rDffStrm, aHeader ); break; case DFF_msofbtSpgrContainer: - ProcessShGrContainer( rDffStrm, aHeader ); + isBreak = !ProcessShGrContainer( rDffStrm, aHeader ); break; default: isBreak = !aHeader.SeekToEndOfRecord( rDffStrm ); } } // seek to end of drawing page container - rDgHeader.SeekToEndOfRecord( rDffStrm ); + isBreak = !rDgHeader.SeekToEndOfRecord( rDffStrm ); // #i12638# #i37900# connector rules XclImpSolverContainer& rSolverCont = GetConvData().maSolverCont; rSolverCont.UpdateConnectorRules(); SolveSolver( rSolverCont ); rSolverCont.RemoveConnectorRules(); + return !isBreak; } -void XclImpDffConverter::ProcessShGrContainer( SvStream& rDffStrm, const DffRecordHeader& rShGrHeader ) +bool XclImpDffConverter::ProcessShGrContainer( SvStream& rDffStrm, const DffRecordHeader& rShGrHeader ) { std::size_t nEndPos = rShGrHeader.GetRecEndFilePos(); bool isBreak(false); @@ -3723,27 +3724,27 @@ void XclImpDffConverter::ProcessShGrContainer( SvStream& rDffStrm, const DffReco { case DFF_msofbtSpgrContainer: case DFF_msofbtSpContainer: - ProcessShContainer( rDffStrm, aHeader ); + isBreak = !ProcessShContainer( rDffStrm, aHeader ); break; default: isBreak = !aHeader.SeekToEndOfRecord( rDffStrm ); } } // seek to end of shape group container - rShGrHeader.SeekToEndOfRecord( rDffStrm ); + return rShGrHeader.SeekToEndOfRecord( rDffStrm ) && !isBreak; } -void XclImpDffConverter::ProcessSolverContainer( SvStream& rDffStrm, const DffRecordHeader& rSolverHeader ) +bool XclImpDffConverter::ProcessSolverContainer( SvStream& rDffStrm, const DffRecordHeader& rSolverHeader ) { // solver container wants to read the solver container header again rSolverHeader.SeekToBegOfRecord( rDffStrm ); // read the entire solver container ReadSvxMSDffSolverContainer( rDffStrm, GetConvData().maSolverCont ); // seek to end of solver container - rSolverHeader.SeekToEndOfRecord( rDffStrm ); + return rSolverHeader.SeekToEndOfRecord( rDffStrm ); } -void XclImpDffConverter::ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader ) +bool XclImpDffConverter::ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader ) { rShHeader.SeekToBegOfRecord( rDffStrm ); tools::Rectangle aDummy; @@ -3757,7 +3758,7 @@ void XclImpDffConverter::ProcessShContainer( SvStream& rDffStrm, const DffRecord SdrObjectPtr xSdrObj( ImportObj( rDffStrm, &pDrawObj, aDummy, aDummy ) ); if( pDrawObj && xSdrObj ) InsertSdrObject( GetConvData().mrSdrPage, *pDrawObj, xSdrObj.release() ); - rShHeader.SeekToEndOfRecord( rDffStrm ); + return rShHeader.SeekToEndOfRecord( rDffStrm ); } void XclImpDffConverter::InsertSdrObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj ) diff --git a/sc/source/filter/inc/xiescher.hxx b/sc/source/filter/inc/xiescher.hxx index a4ac864c585d..6d0e7b1d56ef 100644 --- a/sc/source/filter/inc/xiescher.hxx +++ b/sc/source/filter/inc/xiescher.hxx @@ -1023,13 +1023,13 @@ private: OUString ReadHlinkProperty( SvStream& rDffStrm ) const; /** Processes a drawing container (all drawing data of a sheet). */ - void ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader ); + bool ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader ); /** Processes the global shape group container (all shapes of a sheet). */ - void ProcessShGrContainer( SvStream& rDffStrm, const DffRecordHeader& rShGrHeader ); + bool ProcessShGrContainer( SvStream& rDffStrm, const DffRecordHeader& rShGrHeader ); /** Processes the solver container (connectors of a sheet). */ - void ProcessSolverContainer( SvStream& rDffStrm, const DffRecordHeader& rSolverHeader ); + bool ProcessSolverContainer( SvStream& rDffStrm, const DffRecordHeader& rSolverHeader ); /** Processes a shape or shape group container (one top-level shape). */ - void ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader ); + bool ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader ); /** Inserts the passed SdrObject into the document. This function takes ownership of pSdrObj! */ void InsertSdrObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj ); |