sfnt: Ignore invalid GIDs in glyph name lookup.

This commit is contained in:
suzuki toshiya 2009-08-01 00:32:24 +09:00
parent eec405540d
commit 61adbe980a
3 changed files with 33 additions and 4 deletions

View File

@ -1,3 +1,14 @@
2009-07-31 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
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-31 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
pcf: Fix a comparison between FT_Long and FT_ULong.

View File

@ -43,6 +43,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) */

View File

@ -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;
for ( i = 0; i < root->num_glyphs; i++ )
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 < 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;