filter/source/msfilter/dffrecordheader.cxx | 35 +++++++++++------------------ sd/source/filter/ppt/pptatom.cxx | 6 +--- 2 files changed, 16 insertions(+), 25 deletions(-)
New commits: commit d5288dd29611f2e5c4140724255cea8e7bb2b25b Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Tue Jan 4 21:27:40 2022 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Thu Jan 6 18:14:30 2022 +0100 ofz#42785 Timeout Stream::Seek (like istream::seekg) clears any eofbit Change-Id: I90253e69a52c4099aa2971294a215dff37e8a246 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127975 Tested-by: Caolán McNamara <caol...@redhat.com> Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/filter/source/msfilter/dffrecordheader.cxx b/filter/source/msfilter/dffrecordheader.cxx index 2a8c91a89b1b..c94bec53b611 100644 --- a/filter/source/msfilter/dffrecordheader.cxx +++ b/filter/source/msfilter/dffrecordheader.cxx @@ -22,28 +22,21 @@ bool ReadDffRecordHeader(SvStream& rIn, DffRecordHeader& rRec) { rRec.nFilePos = rIn.Tell(); - if (rIn.remainingSize() >= 8) - { - sal_uInt16 nTmp(0); - rIn.ReadUInt16(nTmp); - rRec.nImpVerInst = nTmp; - rRec.nRecVer = sal::static_int_cast<sal_uInt8>(nTmp & 0x000F); - rRec.nRecInstance = nTmp >> 4; - rIn.ReadUInt16(rRec.nRecType); - rIn.ReadUInt32(rRec.nRecLen); + sal_uInt16 nTmp(0); + rIn.ReadUInt16(nTmp); + rRec.nImpVerInst = nTmp; + rRec.nRecVer = sal::static_int_cast<sal_uInt8>(nTmp & 0x000F); + rRec.nRecInstance = nTmp >> 4; + rRec.nRecType = 0; + rIn.ReadUInt16(rRec.nRecType); + rRec.nRecLen = 0; + rIn.ReadUInt32(rRec.nRecLen); + + // preserving overflow, optimally we would check + // the record size against the parent header + if (rRec.nRecLen > (SAL_MAX_UINT32 - rRec.nFilePos)) + rIn.SetError(SVSTREAM_FILEFORMAT_ERROR); - // preserving overflow, optimally we would check - // the record size against the parent header - if (rRec.nRecLen > (SAL_MAX_UINT32 - rRec.nFilePos)) - rIn.SetError(SVSTREAM_FILEFORMAT_ERROR); - } - else - { - rRec.nImpVerInst = 0; - rRec.nRecVer = 0; - rRec.nRecInstance = 0; - rIn.Seek(STREAM_SEEK_TO_END); - } return rIn.good(); } diff --git a/sd/source/filter/ppt/pptatom.cxx b/sd/source/filter/ppt/pptatom.cxx index 90e61e738ffb..20d52eb8c63f 100644 --- a/sd/source/filter/ppt/pptatom.cxx +++ b/sd/source/filter/ppt/pptatom.cxx @@ -39,13 +39,11 @@ Atom::Atom( const DffRecordHeader& rRecordHeader, SvStream& rStream ) // retrieve file size (to allow sanity checks) sal_uInt64 const nStreamSize = mrStream.TellEnd(); - while( (mrStream.GetError() == ERRCODE_NONE ) + while( mrStream.good() && ( mrStream.Tell() < nStreamSize ) && ( mrStream.Tell() < maRecordHeader.GetRecEndFilePos() ) ) { - ReadDffRecordHeader( mrStream, aChildHeader ); - - if( mrStream.GetError() == ERRCODE_NONE ) + if (ReadDffRecordHeader(mrStream, aChildHeader)) { Atom* pAtom = new Atom( aChildHeader, mrStream );