vcl/source/fontsubset/sft.cxx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
New commits: commit 3a371df3ecce456c9329a493f48600431d2ade69 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Wed Mar 2 10:13:53 2022 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Wed Mar 2 12:56:25 2022 +0100 ofz: detect endless loop in font processing Change-Id: I4e6c61d8be15a560f43b5d37d646e7bad9739eb7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130833 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx index f59c26da4f0c..00c46d3caf1f 100644 --- a/vcl/source/fontsubset/sft.cxx +++ b/vcl/source/fontsubset/sft.cxx @@ -506,9 +506,9 @@ static int GetCompoundTTOutline(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, C if( std::find( glyphlist.begin(), glyphlist.end(), index ) != glyphlist.end() ) { -#if OSL_DEBUG_LEVEL > 1 - SAL_INFO("vcl.fonts", "Endless loop found in a compound glyph."); + SAL_WARN("vcl.fonts", "Endless loop found in a compound glyph."); +#if OSL_DEBUG_LEVEL > 1 std::ostringstream oss; oss << index << " -> ["; for( const auto& rGlyph : glyphlist ) @@ -519,6 +519,7 @@ static int GetCompoundTTOutline(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, C SAL_INFO("vcl.fonts", oss.str()); /**/ #endif + return 0; } glyphlist.push_back( index ); @@ -526,10 +527,8 @@ static int GetCompoundTTOutline(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, C if ((np = GetTTGlyphOutline(ttf, index, &nextComponent, nullptr, &glyphlist)) == 0) { /* XXX that probably indicates a corrupted font */ -#if OSL_DEBUG_LEVEL > 1 SAL_WARN("vcl.fonts", "An empty compound!"); /* assert(!"An empty compound"); */ -#endif } if( ! glyphlist.empty() ) @@ -1417,6 +1416,12 @@ int GetTTGlyphComponents(AbstractTrueTypeFont *ttf, sal_uInt32 glyphID, std::vec if (nptr <= ptr) return 0; + if (std::find(glyphlist.begin(), glyphlist.end(), glyphID) != glyphlist.end()) + { + SAL_WARN("vcl.fonts", "Endless loop found in a compound glyph."); + return 0; + } + glyphlist.push_back( glyphID ); const sal_uInt32 nMaxGlyphSize = glyflength - nOffset;