vcl/source/gdi/gdimtf.cxx | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-)
New commits: commit aec27009c732d19764423ec41c231bb945dbd728 Author: Caolán McNamara <caol...@redhat.com> Date: Mon Feb 13 10:41:08 2017 +0000 Resolves: ofz#584 don't terminate on bad fraction exception Change-Id: Icf6c7a29ad129550fbc533c3af2b77fe7e91ce26 diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx index dc48275..320e9a1 100644 --- a/vcl/source/gdi/gdimtf.cxx +++ b/vcl/source/gdi/gdimtf.cxx @@ -2672,54 +2672,62 @@ SvStream& ReadGDIMetaFile( SvStream& rIStm, GDIMetaFile& rGDIMetaFile ) return rIStm; } - char aId[ 7 ]; sal_uLong nStmPos = rIStm.Tell(); SvStreamEndian nOldFormat = rIStm.GetEndian(); rIStm.SetEndian( SvStreamEndian::LITTLE ); - aId[ 0 ] = 0; - aId[ 6 ] = 0; - rIStm.ReadBytes( aId, 6 ); - - if ( !strcmp( aId, "VCLMTF" ) ) + try { - // new format - sal_uInt32 nStmCompressMode = 0; - sal_uInt32 nCount = 0; - std::unique_ptr<VersionCompat> pCompat(new VersionCompat( rIStm, StreamMode::READ )); + char aId[7]; + aId[0] = 0; + aId[6] = 0; + rIStm.ReadBytes( aId, 6 ); - rIStm.ReadUInt32( nStmCompressMode ); - ReadMapMode( rIStm, rGDIMetaFile.m_aPrefMapMode ); - ReadPair( rIStm, rGDIMetaFile.m_aPrefSize ); - rIStm.ReadUInt32( nCount ); + if ( !strcmp( aId, "VCLMTF" ) ) + { + // new format + sal_uInt32 nStmCompressMode = 0; + sal_uInt32 nCount = 0; + std::unique_ptr<VersionCompat> pCompat(new VersionCompat( rIStm, StreamMode::READ )); - pCompat.reset(); // destructor writes stuff into the header + rIStm.ReadUInt32( nStmCompressMode ); + ReadMapMode( rIStm, rGDIMetaFile.m_aPrefMapMode ); + ReadPair( rIStm, rGDIMetaFile.m_aPrefSize ); + rIStm.ReadUInt32( nCount ); - ImplMetaReadData aReadData; - aReadData.meActualCharSet = rIStm.GetStreamCharSet(); + pCompat.reset(); // destructor writes stuff into the header - for( sal_uInt32 nAction = 0UL; ( nAction < nCount ) && !rIStm.IsEof(); nAction++ ) - { - MetaAction* pAction = MetaAction::ReadMetaAction( rIStm, &aReadData ); - if( pAction ) + ImplMetaReadData aReadData; + aReadData.meActualCharSet = rIStm.GetStreamCharSet(); + + for( sal_uInt32 nAction = 0UL; ( nAction < nCount ) && !rIStm.IsEof(); nAction++ ) { - if (pAction->GetType() == MetaActionType::COMMENT) + MetaAction* pAction = MetaAction::ReadMetaAction( rIStm, &aReadData ); + if( pAction ) { - MetaCommentAction* pCommentAct = static_cast<MetaCommentAction*>(pAction); - if ( pCommentAct->GetComment() == "EMF_PLUS" ) - rGDIMetaFile.UseCanvas( true ); + if (pAction->GetType() == MetaActionType::COMMENT) + { + MetaCommentAction* pCommentAct = static_cast<MetaCommentAction*>(pAction); + if ( pCommentAct->GetComment() == "EMF_PLUS" ) + rGDIMetaFile.UseCanvas( true ); + } + rGDIMetaFile.AddAction( pAction ); } - rGDIMetaFile.AddAction( pAction ); } } + else + { + // to avoid possible compiler optimizations => new/delete + rIStm.Seek( nStmPos ); + delete( new SVMConverter( rIStm, rGDIMetaFile, CONVERT_FROM_SVM1 ) ); + } } - else + catch (...) { - // to avoid possible compiler optimizations => new/delete - rIStm.Seek( nStmPos ); - delete( new SVMConverter( rIStm, rGDIMetaFile, CONVERT_FROM_SVM1 ) ); - } + SAL_WARN("vcl", "GDIMetaFile exception during load"); + rIStm.SetError(SVSTREAM_FILEFORMAT_ERROR); + }; // check for errors if( rIStm.GetError() ) commit a9f5140ed087961dbb951da87c040b049bc4e464 Author: Caolán McNamara <caol...@redhat.com> Date: Mon Feb 13 10:31:00 2017 +0000 return early on error no logic change intended Change-Id: I26558d743f1ab6c3d7b42179fe44f06a786806b6 diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx index 1604103..dc48275 100644 --- a/vcl/source/gdi/gdimtf.cxx +++ b/vcl/source/gdi/gdimtf.cxx @@ -2666,71 +2666,69 @@ sal_uLong GDIMetaFile::GetSizeBytes() const SvStream& ReadGDIMetaFile( SvStream& rIStm, GDIMetaFile& rGDIMetaFile ) { - if( !rIStm.GetError() ) + if (rIStm.GetError()) { - char aId[ 7 ]; - sal_uLong nStmPos = rIStm.Tell(); - SvStreamEndian nOldFormat = rIStm.GetEndian(); + SAL_WARN("vcl.gdi", "Stream error: " << rIStm.GetError()); + return rIStm; + } - rIStm.SetEndian( SvStreamEndian::LITTLE ); + char aId[ 7 ]; + sal_uLong nStmPos = rIStm.Tell(); + SvStreamEndian nOldFormat = rIStm.GetEndian(); - aId[ 0 ] = 0; - aId[ 6 ] = 0; - rIStm.ReadBytes( aId, 6 ); + rIStm.SetEndian( SvStreamEndian::LITTLE ); - if ( !strcmp( aId, "VCLMTF" ) ) - { - // new format - sal_uInt32 nStmCompressMode = 0; - sal_uInt32 nCount = 0; - std::unique_ptr<VersionCompat> pCompat(new VersionCompat( rIStm, StreamMode::READ )); + aId[ 0 ] = 0; + aId[ 6 ] = 0; + rIStm.ReadBytes( aId, 6 ); - rIStm.ReadUInt32( nStmCompressMode ); - ReadMapMode( rIStm, rGDIMetaFile.m_aPrefMapMode ); - ReadPair( rIStm, rGDIMetaFile.m_aPrefSize ); - rIStm.ReadUInt32( nCount ); + if ( !strcmp( aId, "VCLMTF" ) ) + { + // new format + sal_uInt32 nStmCompressMode = 0; + sal_uInt32 nCount = 0; + std::unique_ptr<VersionCompat> pCompat(new VersionCompat( rIStm, StreamMode::READ )); + + rIStm.ReadUInt32( nStmCompressMode ); + ReadMapMode( rIStm, rGDIMetaFile.m_aPrefMapMode ); + ReadPair( rIStm, rGDIMetaFile.m_aPrefSize ); + rIStm.ReadUInt32( nCount ); - pCompat.reset(); // destructor writes stuff into the header + pCompat.reset(); // destructor writes stuff into the header - ImplMetaReadData aReadData; - aReadData.meActualCharSet = rIStm.GetStreamCharSet(); + ImplMetaReadData aReadData; + aReadData.meActualCharSet = rIStm.GetStreamCharSet(); - for( sal_uInt32 nAction = 0UL; ( nAction < nCount ) && !rIStm.IsEof(); nAction++ ) + for( sal_uInt32 nAction = 0UL; ( nAction < nCount ) && !rIStm.IsEof(); nAction++ ) + { + MetaAction* pAction = MetaAction::ReadMetaAction( rIStm, &aReadData ); + if( pAction ) { - MetaAction* pAction = MetaAction::ReadMetaAction( rIStm, &aReadData ); - if( pAction ) + if (pAction->GetType() == MetaActionType::COMMENT) { - if (pAction->GetType() == MetaActionType::COMMENT) - { - MetaCommentAction* pCommentAct = static_cast<MetaCommentAction*>(pAction); - if ( pCommentAct->GetComment() == "EMF_PLUS" ) - rGDIMetaFile.UseCanvas( true ); - } - rGDIMetaFile.AddAction( pAction ); + MetaCommentAction* pCommentAct = static_cast<MetaCommentAction*>(pAction); + if ( pCommentAct->GetComment() == "EMF_PLUS" ) + rGDIMetaFile.UseCanvas( true ); } + rGDIMetaFile.AddAction( pAction ); } } - else - { - // to avoid possible compiler optimizations => new/delete - rIStm.Seek( nStmPos ); - delete( new SVMConverter( rIStm, rGDIMetaFile, CONVERT_FROM_SVM1 ) ); - } - - // check for errors - if( rIStm.GetError() ) - { - rGDIMetaFile.Clear(); - rIStm.Seek( nStmPos ); - } - - rIStm.SetEndian( nOldFormat ); } else { - SAL_WARN("vcl.gdi", "Stream error: " << rIStm.GetError()); + // to avoid possible compiler optimizations => new/delete + rIStm.Seek( nStmPos ); + delete( new SVMConverter( rIStm, rGDIMetaFile, CONVERT_FROM_SVM1 ) ); + } + + // check for errors + if( rIStm.GetError() ) + { + rGDIMetaFile.Clear(); + rIStm.Seek( nStmPos ); } + rIStm.SetEndian( nOldFormat ); return rIStm; }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits