summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2017-09-20 12:36:41 +0200
committerMichael Stahl <mstahl@redhat.com>2017-09-20 13:08:43 +0200
commitadbf0374e92508ff7170cc1bde9ca63de112ca11 (patch)
treef45bc1f75037b6e9c313e799bf6a4e71b02118df /sc
parentdc97ede7cffbb5ce704602456ba0f560caee22a2 (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.cxx23
-rw-r--r--sc/source/filter/inc/xiescher.hxx8
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 );