diff --git a/ChangeLog b/ChangeLog index bc8157781..ec3a0d7a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2010-02-26 Behdad Esfahbod + + 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 Fix Savannah bug #28905. diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 46bcd3bb8..54c7fb30c 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; }