Ignore:
Timestamp:
Apr 12, 2009, 10:25:05 AM (13 years ago)
Author:
Eugene Romanenko
Message:

PDF plugin: freetype library updated to version 2.3.9

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/poppler/freetype2/src/sfnt/ttkern.c

    r251 r269  
    66/*    kerning data within the GPOS table at the moment.                    */
    77/*                                                                         */
    8 /*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by             */
     8/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by       */
    99/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
    1010/*                                                                         */
     
    104104      p_next += length;
    105105
     106      if ( p_next > p_limit )  /* handle broken table */
     107        p_next = p_limit;
     108
    106109      /* only use horizontal kerning tables */
    107110      if ( ( coverage & ~8 ) != 0x0001 ||
     
    112115      p        += 6;
    113116
    114       if ( p + 6 * num_pairs > p_limit )
    115         goto NextTable;
     117      if ( ( p_next - p ) / 6 < (int)num_pairs ) /* handle broken count */
     118        num_pairs = (FT_UInt)( ( p_next - p ) / 6 );
    116119
    117120      avail |= mask;
     
    182185    FT_UInt   count, mask = 1;
    183186    FT_Byte*  p       = face->kern_table;
     187    FT_Byte*  p_limit = p + face->kern_table_size;
    184188
    185189
     
    187191    mask = 0x0001;
    188192
    189     for ( count = face->num_kern_tables; count > 0; count--, mask <<= 1 )
     193    for ( count = face->num_kern_tables;
     194          count > 0 && p + 6 <= p_limit;
     195          count--, mask <<= 1 )
    190196    {
    191197      FT_Byte* base     = p;
     
    194200      FT_UInt  length   = FT_NEXT_USHORT( p );
    195201      FT_UInt  coverage = FT_NEXT_USHORT( p );
     202      FT_UInt  num_pairs;
    196203      FT_Int   value    = 0;
    197204
     
    200207
    201208      next = base + length;
     209
     210      if ( next > p_limit )  /* handle broken table */
     211        next = p_limit;
    202212
    203213      if ( ( face->kern_avail_bits & mask ) == 0 )
     
    206216      if ( p + 8 > next )
    207217        goto NextTable;
     218
     219      num_pairs = FT_NEXT_USHORT( p );
     220      p        += 6;
     221
     222      if ( ( next - p ) / 6 < (int)num_pairs )  /* handle broken count  */
     223        num_pairs = (FT_UInt)( ( next - p ) / 6 );
    208224
    209225      switch ( coverage >> 8 )
     
    211227      case 0:
    212228        {
    213           FT_UInt   num_pairs = FT_NEXT_USHORT( p );
    214           FT_ULong  key0      = TT_KERN_INDEX( left_glyph, right_glyph );
    215 
    216 
    217           p += 6;
     229          FT_ULong  key0 = TT_KERN_INDEX( left_glyph, right_glyph );
     230
    218231
    219232          if ( face->kern_order_bits & mask )   /* binary search */
Note: See TracChangeset for help on using the changeset viewer.