Commit 2415cbf3655073070dda5329d4d0f05645bd5896

Behdad Esfahbod 2010-02-26T23:48:53

Improve handling of invalid glyph indices in char->index functions. * src/base/ftobjs.c (FT_Get_First_Char, FT_Get_Next_Char): Use a loop.

diff --git a/ChangeLog b/ChangeLog
index bc81577..ec3a0d7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-02-26  Behdad Esfahbod  <behdad@behdad.org>
+
+	Improve handling of invalid glyph indices in char->index functions.
+
+	* src/base/ftobjs.c (FT_Get_First_Char, FT_Get_Next_Char): Use a
+	loop.
+
 2010-02-18  Chris Liddell  <chris.liddell@artifex.com>
 
 	Fix Savannah bug #28905.
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 46bcd3b..54c7fb3 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -3095,7 +3095,7 @@
       }
       result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode );
     }
-    return  result;
+    return result;
   }
 
 
@@ -3112,11 +3112,13 @@
     if ( face && face->charmap )
     {
       gindex = FT_Get_Char_Index( face, 0 );
-      if ( gindex == 0 )
-        result = FT_Get_Next_Char( face, 0, &gindex );
+      if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs )
+        do {
+          result = FT_Get_Next_Char( face, 0, &gindex );
+        } while ( gindex >= (FT_UInt)face->num_glyphs );
     }
 
-    if ( agindex  )
+    if ( agindex )
       *agindex = gindex;
 
     return result;
@@ -3140,7 +3142,10 @@
       FT_CMap    cmap = FT_CMAP( face->charmap );
 
 
-      gindex = cmap->clazz->char_next( cmap, &code );
+      do {
+        gindex = cmap->clazz->char_next( cmap, &code );
+      } while ( gindex >= (FT_UInt)face->num_glyphs );
+
       result = ( gindex == 0 ) ? 0 : code;
     }