From 7c67ddbf033a6ad594fec57d52fb5924d0e541fe Mon Sep 17 00:00:00 2001 From: suzuki toshiya Date: Fri, 3 Jul 2009 18:01:40 +0900 Subject: sfnt: Ignore invalid GIDs in glyph name lookup. --- ChangeLog | 11 +++++++++++ include/freetype/internal/fttrace.h | 1 + src/sfnt/sfdriver.c | 25 +++++++++++++++++++++---- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 70304fdb0..268dd6d1d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-07-03 suzuki toshiya + + sfnt: Ignore invalid GIDs in glyph name lookup. + + * include/freetype/internal/fttrace.h: + New trace module for sfdriver.c is added. + + * src/sfnt/sfdriver.c (sfnt_get_name_index): + Restrict glyph name lookup to FT_UInt GID. + Genuine TrueType can hold 16-bit glyphs. + 2009-07-03 suzuki toshiya pcf: Fix a comparison between FT_Long and FT_ULong. diff --git a/include/freetype/internal/fttrace.h b/include/freetype/internal/fttrace.h index 893bddeae..2da65b1cb 100644 --- a/include/freetype/internal/fttrace.h +++ b/include/freetype/internal/fttrace.h @@ -42,6 +42,7 @@ FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */ FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ /* SFNT driver components */ +FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */ FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */ diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c index 5429fde41..8d7d5e5f2 100644 --- a/src/sfnt/sfdriver.c +++ b/src/sfnt/sfdriver.c @@ -49,6 +49,15 @@ #include FT_SERVICE_SFNT_H #include FT_SERVICE_TT_CMAP_H + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_sfdriver + /* * SFNT TABLE SERVICE @@ -157,11 +166,19 @@ sfnt_get_name_index( TT_Face face, FT_String* glyph_name ) { - FT_Face root = &face->root; - FT_Long i; + FT_Face root = &face->root; + FT_UInt i, max_gid = FT_UINT_MAX; + + if ( root->num_glyphs < 0 ) + return 0; + else if ( ( FT_ULong ) root->num_glyphs < FT_UINT_MAX ) + max_gid = ( FT_UInt ) root->num_glyphs; + else + FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n", + FT_UINT_MAX, root->num_glyphs )); - for ( i = 0; i < root->num_glyphs; i++ ) + for ( i = 0; i < max_gid; i++ ) { FT_String* gname; FT_Error error = tt_face_get_ps_name( face, i, &gname ); @@ -171,7 +188,7 @@ continue; if ( !ft_strcmp( glyph_name, gname ) ) - return (FT_UInt)i; + return i; } return 0; -- cgit v1.2.1