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;

Reply via email to