diff options
| author | scuri <scuri> | 2009-10-20 17:20:18 +0000 | 
|---|---|---|
| committer | scuri <scuri> | 2009-10-20 17:20:18 +0000 | 
| commit | 27a4f9c4ac45ff65f941964f7351b64b1e6a9f35 (patch) | |
| tree | 2f68c5d9ce5bf6cbc320ac17aef0a65a3ceb99a1 /src/freetype2/bdf | |
| parent | 2b70507615b2611fce4294c65bec7264644e2665 (diff) | |
*** empty log message ***
Diffstat (limited to 'src/freetype2/bdf')
| -rw-r--r-- | src/freetype2/bdf/bdf.h | 6 | ||||
| -rw-r--r-- | src/freetype2/bdf/bdfdrivr.c | 85 | ||||
| -rw-r--r-- | src/freetype2/bdf/bdfdrivr.h | 4 | ||||
| -rw-r--r-- | src/freetype2/bdf/bdflib.c | 87 | 
4 files changed, 113 insertions, 69 deletions
| diff --git a/src/freetype2/bdf/bdf.h b/src/freetype2/bdf/bdf.h index 1b64426..561b415 100644 --- a/src/freetype2/bdf/bdf.h +++ b/src/freetype2/bdf/bdf.h @@ -114,8 +114,8 @@ FT_BEGIN_HEADER      union      {        char*          atom; -      long           int32; -      unsigned long  card32; +      long           l; +      unsigned long  ul;      } value;             /* Value of the property.  */ @@ -160,7 +160,7 @@ FT_BEGIN_HEADER    typedef struct  _hashnode_    {      const char*  key; -    void*        data; +    size_t       data;    } _hashnode, *hashnode; diff --git a/src/freetype2/bdf/bdfdrivr.c b/src/freetype2/bdf/bdfdrivr.c index 74cc2f1..631ec46 100644 --- a/src/freetype2/bdf/bdfdrivr.c +++ b/src/freetype2/bdf/bdfdrivr.c @@ -2,7 +2,7 @@      FreeType font driver for bdf files -    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 by +    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by      Francesco Zappa Nardelli  Permission is hereby granted, free of charge, to any person obtaining a copy @@ -53,7 +53,7 @@ THE SOFTWARE.    typedef struct  BDF_CMapRec_    {      FT_CMapRec        cmap; -    FT_UInt           num_encodings; +    FT_ULong          num_encodings; /* ftobjs.h: FT_CMap->clazz->size */      BDF_encoding_el*  encodings;    } BDF_CMapRec, *BDF_CMap; @@ -92,8 +92,8 @@ THE SOFTWARE.    {      BDF_CMap          cmap      = (BDF_CMap)bdfcmap;      BDF_encoding_el*  encodings = cmap->encodings; -    FT_UInt           min, max, mid; -    FT_UInt           result    = 0; +    FT_ULong          min, max, mid; /* num_encodings */ +    FT_UShort         result    = 0; /* encodings->glyph */      min = 0; @@ -101,7 +101,7 @@ THE SOFTWARE.      while ( min < max )      { -      FT_UInt32  code; +      FT_ULong  code;        mid  = ( min + max ) >> 1; @@ -131,9 +131,9 @@ THE SOFTWARE.    {      BDF_CMap          cmap      = (BDF_CMap)bdfcmap;      BDF_encoding_el*  encodings = cmap->encodings; -    FT_UInt           min, max, mid; -    FT_UInt32         charcode = *acharcode + 1; -    FT_UInt           result   = 0; +    FT_ULong          min, max, mid; /* num_encodings */ +    FT_UShort         result   = 0;  /* encodings->glyph */ +    FT_ULong          charcode = *acharcode + 1;      min = 0; @@ -141,7 +141,7 @@ THE SOFTWARE.      while ( min < max )      { -      FT_UInt32  code; +      FT_ULong  code; /* same as BDF_encoding_el.enc */        mid  = ( min + max ) >> 1; @@ -169,7 +169,14 @@ THE SOFTWARE.      }    Exit: -    *acharcode = charcode; +    if ( charcode > 0xFFFFFFFFUL ) +    { +      FT_TRACE1(( "bdf_cmap_char_next: charcode 0x%x > 32bit API" )); +      *acharcode = 0; +      /* XXX: result should be changed to indicate an overflow error */ +    } +    else +      *acharcode = (FT_UInt32)charcode;      return result;    } @@ -181,7 +188,9 @@ THE SOFTWARE.      bdf_cmap_init,      bdf_cmap_done,      bdf_cmap_char_index, -    bdf_cmap_char_next +    bdf_cmap_char_next, + +    NULL, NULL, NULL, NULL, NULL    }; @@ -194,9 +203,8 @@ THE SOFTWARE.      bdf_font_t*      font   = bdf->bdffont;      bdf_property_t*  prop; -    int    nn, len; -    char*  strings[4] = { NULL, NULL, NULL, NULL }; -    int    lengths[4]; +    char*   strings[4] = { NULL, NULL, NULL, NULL }; +    size_t  nn, len, lengths[4];      face->style_flags = 0; @@ -282,7 +290,7 @@ THE SOFTWARE.          /* add_style_name and setwidth_name     */          if ( nn == 0 || nn == 3 )          { -          int  mm; +          size_t  mm;            for ( mm = 0; mm < len; mm++ ) @@ -302,9 +310,14 @@ THE SOFTWARE.    FT_CALLBACK_DEF( void )    BDF_Face_Done( FT_Face  bdfface )         /* BDF_Face */    { -    BDF_Face   face   = (BDF_Face)bdfface; -    FT_Memory  memory = FT_FACE_MEMORY( face ); +    BDF_Face   face = (BDF_Face)bdfface; +    FT_Memory  memory; + + +    if ( !face ) +      return; +    memory = FT_FACE_MEMORY( face );      bdf_free_font( face->bdffont ); @@ -419,7 +432,7 @@ THE SOFTWARE.          prop = bdf_get_font_property( font, "AVERAGE_WIDTH" );          if ( prop ) -          bsize->width = (FT_Short)( ( prop->value.int32 + 5 ) / 10 ); +          bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 );          else            bsize->width = (FT_Short)( bsize->height * 2/3 ); @@ -427,21 +440,21 @@ THE SOFTWARE.          if ( prop )            /* convert from 722.7 decipoints to 72 points per inch */            bsize->size = -            (FT_Pos)( ( prop->value.int32 * 64 * 7200 + 36135L ) / 72270L ); +            (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L );          else            bsize->size = bsize->width << 6;          prop = bdf_get_font_property( font, "PIXEL_SIZE" );          if ( prop ) -          bsize->y_ppem = (FT_Short)prop->value.int32 << 6; +          bsize->y_ppem = (FT_Short)prop->value.l << 6;          prop = bdf_get_font_property( font, "RESOLUTION_X" );          if ( prop ) -          resolution_x = (FT_Short)prop->value.int32; +          resolution_x = (FT_Short)prop->value.l;          prop = bdf_get_font_property( font, "RESOLUTION_Y" );          if ( prop ) -          resolution_y = (FT_Short)prop->value.int32; +          resolution_y = (FT_Short)prop->value.l;          if ( bsize->y_ppem == 0 )          { @@ -472,7 +485,12 @@ THE SOFTWARE.            (face->en_table[n]).glyph = (FT_Short)n;            if ( cur[n].encoding == font->default_char ) -            face->default_glyph = n; +          { +            if ( n < FT_UINT_MAX ) +              face->default_glyph = (FT_UInt)n; +            else +              FT_TRACE1(( "idx %d is too large for this system\n", n )); +          }          }        } @@ -608,7 +626,7 @@ THE SOFTWARE.      switch ( req->type )      {      case FT_SIZE_REQUEST_TYPE_NOMINAL: -      if ( height == ( bsize->y_ppem + 32 ) >> 6 ) +      if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) )          error = BDF_Err_Ok;        break; @@ -664,7 +682,10 @@ THE SOFTWARE.      bitmap->rows  = glyph.bbx.height;      bitmap->width = glyph.bbx.width; -    bitmap->pitch = glyph.bpr; +    if ( glyph.bpr > INT_MAX ) +      FT_TRACE1(( "BDF_Glyph_Load: too large pitch %d is truncated\n", +                   glyph.bpr )); +    bitmap->pitch = (int)glyph.bpr; /* same as FT_Bitmap.pitch */      /* note: we don't allocate a new array to hold the bitmap; */      /*       we can simply point to it                         */ @@ -736,13 +757,23 @@ THE SOFTWARE.          break;        case BDF_INTEGER: +        if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) ) +        { +          FT_TRACE1(( "bdf_get_bdf_property: " )); +          FT_TRACE1(( "too large integer 0x%x is truncated\n" )); +        }          aproperty->type      = BDF_PROPERTY_TYPE_INTEGER; -        aproperty->u.integer = prop->value.int32; +        aproperty->u.integer = (FT_Int32)prop->value.l;          break;        case BDF_CARDINAL: +        if ( prop->value.ul > 0xFFFFFFFFUL ) +        { +          FT_TRACE1(( "bdf_get_bdf_property: " )); +          FT_TRACE1(( "too large cardinal 0x%x is truncated\n" )); +        }          aproperty->type       = BDF_PROPERTY_TYPE_CARDINAL; -        aproperty->u.cardinal = prop->value.card32; +        aproperty->u.cardinal = (FT_UInt32)prop->value.ul;          break;        default: diff --git a/src/freetype2/bdf/bdfdrivr.h b/src/freetype2/bdf/bdfdrivr.h index 86f40ee..db7093b 100644 --- a/src/freetype2/bdf/bdfdrivr.h +++ b/src/freetype2/bdf/bdfdrivr.h @@ -36,6 +36,10 @@ THE SOFTWARE.  FT_BEGIN_HEADER +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif  +    typedef struct  BDF_encoding_el_    { diff --git a/src/freetype2/bdf/bdflib.c b/src/freetype2/bdf/bdflib.c index 512cd62..5fa5868 100644 --- a/src/freetype2/bdf/bdflib.c +++ b/src/freetype2/bdf/bdflib.c @@ -1,6 +1,6 @@  /*   * Copyright 2000 Computing Research Labs, New Mexico State University - * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007 + * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009   *   Francesco Zappa Nardelli   *   * Permission is hereby granted, free of charge, to any person obtaining a @@ -281,7 +281,7 @@    static FT_Error    hash_insert( char*       key, -               void*       data, +               size_t      data,                 hashtable*  ht,                 FT_Memory   memory )    { @@ -415,18 +415,18 @@    static FT_Error -  _bdf_list_ensure( _bdf_list_t*  list, -                    int           num_items ) +  _bdf_list_ensure( _bdf_list_t*   list, +                    unsigned long  num_items ) /* same as _bdf_list_t.used */    {      FT_Error  error = BDF_Err_Ok; -    if ( num_items > (int)list->size ) +    if ( num_items > list->size )      { -      int        oldsize = list->size; -      int        newsize = oldsize + ( oldsize >> 1 ) + 4; -      int        bigsize = FT_INT_MAX / sizeof ( char* ); -      FT_Memory  memory  = list->memory; +      unsigned long  oldsize = list->size; /* same as _bdf_list_t.size */ +      unsigned long  newsize = oldsize + ( oldsize >> 1 ) + 4; +      unsigned long  bigsize = (unsigned long)( FT_INT_MAX / sizeof ( char* ) ); +      FT_Memory      memory  = list->memory;        if ( oldsize == bigsize ) @@ -614,8 +614,8 @@    {      _bdf_line_func_t  cb;      unsigned long     lineno, buf_size; -    int               refill, bytes, hold, to_skip; -    int               start, end, cursor, avail; +    int               refill, hold, to_skip; +    ptrdiff_t         bytes, start, end, cursor, avail;      char*             buf = 0;      FT_Memory         memory = stream->memory;      FT_Error          error = BDF_Err_Ok; @@ -648,8 +648,8 @@      {        if ( refill )        { -        bytes  = (int)FT_Stream_TryRead( stream, (FT_Byte*)buf + cursor, -                                         (FT_ULong)(buf_size - cursor) ); +        bytes  = (ptrdiff_t)FT_Stream_TryRead( stream, (FT_Byte*)buf + cursor, +                                               (FT_ULong)(buf_size - cursor) );          avail  = cursor + bytes;          cursor = 0;          refill = 0; @@ -971,7 +971,7 @@                         int          format,                         bdf_font_t*  font )    { -    unsigned long    n; +    size_t           n;      bdf_property_t*  p;      FT_Memory        memory = font->memory;      FT_Error         error = BDF_Err_Ok; @@ -991,7 +991,9 @@      p = font->user_props + font->nuser_props;      FT_ZERO( p ); -    n = (unsigned long)( ft_strlen( name ) + 1 ); +    n = ft_strlen( name ) + 1; +    if ( n > FT_ULONG_MAX ) +      return BDF_Err_Invalid_Argument;      if ( FT_NEW_ARRAY( p->name, n ) )        goto Exit; @@ -1003,7 +1005,7 @@      n = _num_bdf_properties + font->nuser_props; -    error = hash_insert( p->name, (void *)n, &(font->proptbl), memory ); +    error = hash_insert( p->name, n, &(font->proptbl), memory );      if ( error )        goto Exit; @@ -1018,8 +1020,8 @@    bdf_get_property( char*        name,                      bdf_font_t*  font )    { -    hashnode       hn; -    unsigned long  propid; +    hashnode  hn; +    size_t    propid;      if ( name == 0 || *name == 0 ) @@ -1028,7 +1030,7 @@      if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 )        return 0; -    propid = (unsigned long)hn->data; +    propid = hn->data;      if ( propid >= _num_bdf_properties )        return font->user_props + ( propid - _num_bdf_properties ); @@ -1131,11 +1133,11 @@    _bdf_set_default_spacing( bdf_font_t*     font,                              bdf_options_t*  opts )    { -    unsigned long  len; -    char           name[256]; -    _bdf_list_t    list; -    FT_Memory      memory; -    FT_Error       error = BDF_Err_Ok; +    size_t       len; +    char         name[256]; +    _bdf_list_t  list; +    FT_Memory    memory; +    FT_Error     error = BDF_Err_Ok;      if ( font == 0 || font->name == 0 || font->name[0] == 0 ) @@ -1150,7 +1152,7 @@      font->spacing = opts->font_spacing; -    len = (unsigned long)( ft_strlen( font->name ) + 1 ); +    len = ft_strlen( font->name ) + 1;      /* Limit ourselves to 256 characters in the font name. */      if ( len >= 256 )      { @@ -1261,7 +1263,7 @@                       char*        name,                       char*        value )    { -    unsigned long   propid; +    size_t          propid;      hashnode        hn;      bdf_property_t  *prop, *fp;      FT_Memory       memory = font->memory; @@ -1273,7 +1275,7 @@      {        /* The property already exists in the font, so simply replace */        /* the value of the property with the current value.          */ -      fp = font->props + (unsigned long)hn->data; +      fp = font->props + hn->data;        switch ( fp->format )        { @@ -1289,11 +1291,11 @@          break;        case BDF_INTEGER: -        fp->value.int32 = _bdf_atol( value, 0, 10 ); +        fp->value.l = _bdf_atol( value, 0, 10 );          break;        case BDF_CARDINAL: -        fp->value.card32 = _bdf_atoul( value, 0, 10 ); +        fp->value.ul = _bdf_atoul( value, 0, 10 );          break;        default: @@ -1335,7 +1337,7 @@        font->props_size++;      } -    propid = (unsigned long)hn->data; +    propid = hn->data;      if ( propid >= _num_bdf_properties )        prop = font->user_props + ( propid - _num_bdf_properties );      else @@ -1359,11 +1361,11 @@        break;      case BDF_INTEGER: -      fp->value.int32 = _bdf_atol( value, 0, 10 ); +      fp->value.l = _bdf_atol( value, 0, 10 );        break;      case BDF_CARDINAL: -      fp->value.card32 = _bdf_atoul( value, 0, 10 ); +      fp->value.ul = _bdf_atoul( value, 0, 10 );        break;      } @@ -1372,7 +1374,7 @@      if ( ft_memcmp( name, "COMMENT", 7 ) != 0 ) {        /* Add the property to the font property table. */        error = hash_insert( fp->name, -                           (void *)font->props_used, +                           font->props_used,                             (hashtable *)font->internal,                             memory );        if ( error ) @@ -1387,13 +1389,19 @@      /* present, and the SPACING property should override the default       */      /* spacing.                                                            */      if ( ft_memcmp( name, "DEFAULT_CHAR", 12 ) == 0 ) -      font->default_char = fp->value.int32; +      font->default_char = fp->value.l;      else if ( ft_memcmp( name, "FONT_ASCENT", 11 ) == 0 ) -      font->font_ascent = fp->value.int32; +      font->font_ascent = fp->value.l;      else if ( ft_memcmp( name, "FONT_DESCENT", 12 ) == 0 ) -      font->font_descent = fp->value.int32; +      font->font_descent = fp->value.l;      else if ( ft_memcmp( name, "SPACING", 7 ) == 0 )      { +      if ( !fp->value.atom ) +      { +        error = BDF_Err_Invalid_File_Format; +        goto Exit; +      } +        if ( fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P' )          font->spacing = BDF_PROPORTIONAL;        else if ( fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M' ) @@ -2038,7 +2046,7 @@        p->memory    = 0;        { /* setup */ -        unsigned long    i; +        size_t           i;          bdf_property_t*  prop; @@ -2048,7 +2056,7 @@          for ( i = 0, prop = (bdf_property_t*)_bdf_properties;                i < _num_bdf_properties; i++, prop++ )          { -          error = hash_insert( prop->name, (void *)i, +          error = hash_insert( prop->name, i,                                 &(font->proptbl), memory );            if ( error )              goto Exit; @@ -2072,6 +2080,7 @@        error = _bdf_list_split( &p->list, (char *)" +", line, linelen );        if ( error )          goto Exit; +      /* at this point, `p->font' can't be NULL */        p->cnt = p->font->props_size = _bdf_atoul( p->list.field[1], 0, 10 );        if ( FT_NEW_ARRAY( p->font->props, p->cnt ) ) @@ -2465,7 +2474,7 @@      hn = hash_lookup( name, (hashtable *)font->internal ); -    return hn ? ( font->props + (unsigned long)hn->data ) : 0; +    return hn ? ( font->props + hn->data ) : 0;    } | 
