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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
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;
}