|
|
|
@ -65,7 +65,7 @@ |
|
|
|
|
FT_UShort* buff, |
|
|
|
|
FT_UInt nmemb, |
|
|
|
|
FT_UShort limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_UInt i; |
|
|
|
|
|
|
|
|
@ -130,7 +130,7 @@ |
|
|
|
|
FT_ULong* buff, |
|
|
|
|
FT_UInt nmemb, |
|
|
|
|
FT_ULong limit, |
|
|
|
|
GXV_Validator valid) |
|
|
|
|
GXV_Validator gxvalid) |
|
|
|
|
{ |
|
|
|
|
FT_UInt i; |
|
|
|
|
|
|
|
|
@ -182,7 +182,7 @@ |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
FT_Byte* min, |
|
|
|
|
FT_Byte* max, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
|
|
|
|
@ -202,7 +202,7 @@ |
|
|
|
|
*max = (FT_Byte)FT_MAX( *max, val ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -211,7 +211,7 @@ |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
FT_UShort* min, |
|
|
|
|
FT_UShort* max, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
|
|
|
|
@ -231,7 +231,7 @@ |
|
|
|
|
*max = (FT_Byte)FT_MAX( *max, val ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -256,7 +256,7 @@ |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
gxv_BinSrchHeader_check_consistency( GXV_BinSrchHeader* binSrchHeader, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_UShort searchRange; |
|
|
|
|
FT_UShort entrySelector; |
|
|
|
@ -329,7 +329,7 @@ |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
FT_UShort* unitSize_p, |
|
|
|
|
FT_UShort* nUnits_p, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
GXV_BinSrchHeader binSrchHeader; |
|
|
|
@ -359,7 +359,7 @@ |
|
|
|
|
binSrchHeader.rangeShift = FT_NEXT_USHORT( p ); |
|
|
|
|
GXV_TRACE(( "nUnits %d\n", binSrchHeader.nUnits )); |
|
|
|
|
|
|
|
|
|
gxv_BinSrchHeader_check_consistency( &binSrchHeader, valid ); |
|
|
|
|
gxv_BinSrchHeader_check_consistency( &binSrchHeader, gxvalid ); |
|
|
|
|
|
|
|
|
|
if ( *unitSize_p == 0 ) |
|
|
|
|
*unitSize_p = binSrchHeader.unitSize; |
|
|
|
@ -367,7 +367,7 @@ |
|
|
|
|
if ( *nUnits_p == 0 ) |
|
|
|
|
*nUnits_p = binSrchHeader.nUnits; |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
GXV_EXIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -422,7 +422,7 @@ |
|
|
|
|
static void |
|
|
|
|
gxv_LookupTable_fmt0_validate( FT_Bytes table, |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_UShort i; |
|
|
|
@ -432,24 +432,24 @@ |
|
|
|
|
|
|
|
|
|
GXV_NAME_ENTER( "LookupTable format 0" ); |
|
|
|
|
|
|
|
|
|
GXV_LIMIT_CHECK( 2 * valid->face->num_glyphs ); |
|
|
|
|
GXV_LIMIT_CHECK( 2 * gxvalid->face->num_glyphs ); |
|
|
|
|
|
|
|
|
|
for ( i = 0; i < valid->face->num_glyphs; i++ ) |
|
|
|
|
for ( i = 0; i < gxvalid->face->num_glyphs; i++ ) |
|
|
|
|
{ |
|
|
|
|
GXV_LIMIT_CHECK( 2 ); |
|
|
|
|
if ( p + 2 >= limit ) /* some fonts have too-short fmt0 array */ |
|
|
|
|
{ |
|
|
|
|
GXV_TRACE(( "too short, glyphs %d - %d are missing\n", |
|
|
|
|
i, valid->face->num_glyphs )); |
|
|
|
|
i, gxvalid->face->num_glyphs )); |
|
|
|
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); |
|
|
|
|
valid->lookupval_func( i, &value, valid ); |
|
|
|
|
value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); |
|
|
|
|
gxvalid->lookupval_func( i, &value, gxvalid ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
GXV_EXIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -473,12 +473,12 @@ |
|
|
|
|
static void |
|
|
|
|
gxv_LookupTable_fmt2_skip_endmarkers( FT_Bytes table, |
|
|
|
|
FT_UShort unitSize, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ( ( p + 4 ) < valid->root->limit ) |
|
|
|
|
while ( ( p + 4 ) < gxvalid->root->limit ) |
|
|
|
|
{ |
|
|
|
|
if ( p[0] != 0xFF || p[1] != 0xFF || /* lastGlyph */ |
|
|
|
|
p[2] != 0xFF || p[3] != 0xFF ) /* firstGlyph */ |
|
|
|
@ -486,14 +486,14 @@ |
|
|
|
|
p += unitSize; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
gxv_LookupTable_fmt2_validate( FT_Bytes table, |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_UShort gid; |
|
|
|
@ -509,8 +509,8 @@ |
|
|
|
|
GXV_NAME_ENTER( "LookupTable format 2" ); |
|
|
|
|
|
|
|
|
|
unitSize = nUnits = 0; |
|
|
|
|
gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid ); |
|
|
|
|
p += valid->subtable_length; |
|
|
|
|
gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid ); |
|
|
|
|
p += gxvalid->subtable_length; |
|
|
|
|
|
|
|
|
|
GXV_UNITSIZE_VALIDATE( "format2", unitSize, nUnits, 6 ); |
|
|
|
|
|
|
|
|
@ -519,10 +519,10 @@ |
|
|
|
|
GXV_LIMIT_CHECK( 2 + 2 + 2 ); |
|
|
|
|
lastGlyph = FT_NEXT_USHORT( p ); |
|
|
|
|
firstGlyph = FT_NEXT_USHORT( p ); |
|
|
|
|
value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); |
|
|
|
|
value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); |
|
|
|
|
|
|
|
|
|
gxv_glyphid_validate( firstGlyph, valid ); |
|
|
|
|
gxv_glyphid_validate( lastGlyph, valid ); |
|
|
|
|
gxv_glyphid_validate( firstGlyph, gxvalid ); |
|
|
|
|
gxv_glyphid_validate( lastGlyph, gxvalid ); |
|
|
|
|
|
|
|
|
|
if ( lastGlyph < gid ) |
|
|
|
|
{ |
|
|
|
@ -539,7 +539,7 @@ |
|
|
|
|
unit, lastGlyph, firstGlyph )); |
|
|
|
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); |
|
|
|
|
|
|
|
|
|
if ( valid->root->level == FT_VALIDATE_TIGHT ) |
|
|
|
|
if ( gxvalid->root->level == FT_VALIDATE_TIGHT ) |
|
|
|
|
continue; /* ftxvalidator silently skips such an entry */ |
|
|
|
|
|
|
|
|
|
FT_TRACE4(( "continuing with exchanged values\n" )); |
|
|
|
@ -549,13 +549,13 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) |
|
|
|
|
valid->lookupval_func( gid, &value, valid ); |
|
|
|
|
gxvalid->lookupval_func( gid, &value, gxvalid ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid ); |
|
|
|
|
p += valid->subtable_length; |
|
|
|
|
gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, gxvalid ); |
|
|
|
|
p += gxvalid->subtable_length; |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
GXV_EXIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -564,7 +564,7 @@ |
|
|
|
|
static void |
|
|
|
|
gxv_LookupTable_fmt4_validate( FT_Bytes table, |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_UShort unit; |
|
|
|
@ -581,8 +581,8 @@ |
|
|
|
|
GXV_NAME_ENTER( "LookupTable format 4" ); |
|
|
|
|
|
|
|
|
|
unitSize = nUnits = 0; |
|
|
|
|
gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid ); |
|
|
|
|
p += valid->subtable_length; |
|
|
|
|
gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid ); |
|
|
|
|
p += gxvalid->subtable_length; |
|
|
|
|
|
|
|
|
|
GXV_UNITSIZE_VALIDATE( "format4", unitSize, nUnits, 6 ); |
|
|
|
|
|
|
|
|
@ -592,8 +592,8 @@ |
|
|
|
|
lastGlyph = FT_NEXT_USHORT( p ); |
|
|
|
|
firstGlyph = FT_NEXT_USHORT( p ); |
|
|
|
|
|
|
|
|
|
gxv_glyphid_validate( firstGlyph, valid ); |
|
|
|
|
gxv_glyphid_validate( lastGlyph, valid ); |
|
|
|
|
gxv_glyphid_validate( firstGlyph, gxvalid ); |
|
|
|
|
gxv_glyphid_validate( lastGlyph, gxvalid ); |
|
|
|
|
|
|
|
|
|
if ( lastGlyph < gid ) |
|
|
|
|
{ |
|
|
|
@ -610,7 +610,7 @@ |
|
|
|
|
unit, lastGlyph, firstGlyph )); |
|
|
|
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); |
|
|
|
|
|
|
|
|
|
if ( valid->root->level == FT_VALIDATE_TIGHT ) |
|
|
|
|
if ( gxvalid->root->level == FT_VALIDATE_TIGHT ) |
|
|
|
|
continue; /* ftxvalidator silently skips such an entry */ |
|
|
|
|
|
|
|
|
|
FT_TRACE4(( "continuing with exchanged values\n" )); |
|
|
|
@ -624,19 +624,19 @@ |
|
|
|
|
|
|
|
|
|
for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) |
|
|
|
|
{ |
|
|
|
|
value = valid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ), |
|
|
|
|
value = gxvalid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ), |
|
|
|
|
&base_value, |
|
|
|
|
limit, |
|
|
|
|
valid ); |
|
|
|
|
gxvalid ); |
|
|
|
|
|
|
|
|
|
valid->lookupval_func( gid, &value, valid ); |
|
|
|
|
gxvalid->lookupval_func( gid, &value, gxvalid ); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid ); |
|
|
|
|
p += valid->subtable_length; |
|
|
|
|
gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, gxvalid ); |
|
|
|
|
p += gxvalid->subtable_length; |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
GXV_EXIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -645,26 +645,26 @@ |
|
|
|
|
static void |
|
|
|
|
gxv_LookupTable_fmt6_skip_endmarkers( FT_Bytes table, |
|
|
|
|
FT_UShort unitSize, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ( p < valid->root->limit ) |
|
|
|
|
while ( p < gxvalid->root->limit ) |
|
|
|
|
{ |
|
|
|
|
if ( p[0] != 0xFF || p[1] != 0xFF ) |
|
|
|
|
break; |
|
|
|
|
p += unitSize; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
gxv_LookupTable_fmt6_validate( FT_Bytes table, |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_UShort unit; |
|
|
|
@ -679,8 +679,8 @@ |
|
|
|
|
GXV_NAME_ENTER( "LookupTable format 6" ); |
|
|
|
|
|
|
|
|
|
unitSize = nUnits = 0; |
|
|
|
|
gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid ); |
|
|
|
|
p += valid->subtable_length; |
|
|
|
|
gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid ); |
|
|
|
|
p += gxvalid->subtable_length; |
|
|
|
|
|
|
|
|
|
GXV_UNITSIZE_VALIDATE( "format6", unitSize, nUnits, 4 ); |
|
|
|
|
|
|
|
|
@ -688,9 +688,9 @@ |
|
|
|
|
{ |
|
|
|
|
GXV_LIMIT_CHECK( 2 + 2 ); |
|
|
|
|
glyph = FT_NEXT_USHORT( p ); |
|
|
|
|
value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); |
|
|
|
|
value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); |
|
|
|
|
|
|
|
|
|
if ( gxv_glyphid_validate( glyph, valid ) ) |
|
|
|
|
if ( gxv_glyphid_validate( glyph, gxvalid ) ) |
|
|
|
|
GXV_TRACE(( " endmarker found within defined range" |
|
|
|
|
" (entry %d < nUnits=%d)\n", |
|
|
|
|
unit, nUnits )); |
|
|
|
@ -703,13 +703,13 @@ |
|
|
|
|
} |
|
|
|
|
prev_glyph = glyph; |
|
|
|
|
|
|
|
|
|
valid->lookupval_func( glyph, &value, valid ); |
|
|
|
|
gxvalid->lookupval_func( glyph, &value, gxvalid ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, valid ); |
|
|
|
|
p += valid->subtable_length; |
|
|
|
|
gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, gxvalid ); |
|
|
|
|
p += gxvalid->subtable_length; |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
GXV_EXIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -718,7 +718,7 @@ |
|
|
|
|
static void |
|
|
|
|
gxv_LookupTable_fmt8_validate( FT_Bytes table, |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_UShort i; |
|
|
|
@ -735,18 +735,18 @@ |
|
|
|
|
firstGlyph = FT_NEXT_USHORT( p ); |
|
|
|
|
glyphCount = FT_NEXT_USHORT( p ); |
|
|
|
|
|
|
|
|
|
gxv_glyphid_validate( firstGlyph, valid ); |
|
|
|
|
gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), valid ); |
|
|
|
|
gxv_glyphid_validate( firstGlyph, gxvalid ); |
|
|
|
|
gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), gxvalid ); |
|
|
|
|
|
|
|
|
|
/* valueArray */ |
|
|
|
|
for ( i = 0; i < glyphCount; i++ ) |
|
|
|
|
{ |
|
|
|
|
GXV_LIMIT_CHECK( 2 ); |
|
|
|
|
value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); |
|
|
|
|
valid->lookupval_func( (FT_UShort)( firstGlyph + i ), &value, valid ); |
|
|
|
|
value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); |
|
|
|
|
gxvalid->lookupval_func( (FT_UShort)( firstGlyph + i ), &value, gxvalid ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
GXV_EXIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -754,7 +754,7 @@ |
|
|
|
|
FT_LOCAL_DEF( void ) |
|
|
|
|
gxv_LookupTable_validate( FT_Bytes table, |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_UShort format; |
|
|
|
@ -778,7 +778,7 @@ |
|
|
|
|
GXV_NAME_ENTER( "LookupTable" ); |
|
|
|
|
|
|
|
|
|
/* lookuptbl_head may be used in fmt4 transit function. */ |
|
|
|
|
valid->lookuptbl_head = table; |
|
|
|
|
gxvalid->lookuptbl_head = table; |
|
|
|
|
|
|
|
|
|
/* format */ |
|
|
|
|
GXV_LIMIT_CHECK( 2 ); |
|
|
|
@ -792,10 +792,10 @@ |
|
|
|
|
if ( func == NULL ) |
|
|
|
|
FT_INVALID_FORMAT; |
|
|
|
|
|
|
|
|
|
func( p, limit, valid ); |
|
|
|
|
p += valid->subtable_length; |
|
|
|
|
func( p, limit, gxvalid ); |
|
|
|
|
p += gxvalid->subtable_length; |
|
|
|
|
|
|
|
|
|
valid->subtable_length = p - table; |
|
|
|
|
gxvalid->subtable_length = p - table; |
|
|
|
|
|
|
|
|
|
GXV_EXIT; |
|
|
|
|
} |
|
|
|
@ -811,7 +811,7 @@ |
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( FT_Int ) |
|
|
|
|
gxv_glyphid_validate( FT_UShort gid, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Face face; |
|
|
|
|
|
|
|
|
@ -822,7 +822,7 @@ |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
face = valid->face; |
|
|
|
|
face = gxvalid->face; |
|
|
|
|
if ( face->num_glyphs < gid ) |
|
|
|
|
{ |
|
|
|
|
GXV_TRACE(( " gxv_glyphid_check() gid overflow: num_glyphs %d < %d\n", |
|
|
|
@ -845,7 +845,7 @@ |
|
|
|
|
FT_LOCAL_DEF( void ) |
|
|
|
|
gxv_ctlPoint_validate( FT_UShort gid, |
|
|
|
|
FT_Short ctl_point, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Face face; |
|
|
|
|
FT_Error error; |
|
|
|
@ -855,7 +855,7 @@ |
|
|
|
|
short n_points; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
face = valid->face; |
|
|
|
|
face = gxvalid->face; |
|
|
|
|
|
|
|
|
|
error = FT_Load_Glyph( face, |
|
|
|
|
gid, |
|
|
|
@ -885,7 +885,7 @@ |
|
|
|
|
gxv_sfntName_validate( FT_UShort name_index, |
|
|
|
|
FT_UShort min_index, |
|
|
|
|
FT_UShort max_index, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_SfntName name; |
|
|
|
|
FT_UInt i; |
|
|
|
@ -897,10 +897,10 @@ |
|
|
|
|
if ( name_index < min_index || max_index < name_index ) |
|
|
|
|
FT_INVALID_FORMAT; |
|
|
|
|
|
|
|
|
|
nnames = FT_Get_Sfnt_Name_Count( valid->face ); |
|
|
|
|
nnames = FT_Get_Sfnt_Name_Count( gxvalid->face ); |
|
|
|
|
for ( i = 0; i < nnames; i++ ) |
|
|
|
|
{ |
|
|
|
|
if ( FT_Get_Sfnt_Name( valid->face, i, &name ) != FT_Err_Ok ) |
|
|
|
|
if ( FT_Get_Sfnt_Name( gxvalid->face, i, &name ) != FT_Err_Ok ) |
|
|
|
|
continue ; |
|
|
|
|
|
|
|
|
|
if ( name.name_id == name_index ) |
|
|
|
@ -944,7 +944,7 @@ |
|
|
|
|
FT_UShort* length_p, |
|
|
|
|
FT_UShort stateSize, |
|
|
|
|
FT_Byte* maxClassID_p, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_Bytes limit = table + *length_p; |
|
|
|
@ -965,7 +965,7 @@ |
|
|
|
|
if ( !nGlyphs ) |
|
|
|
|
goto Out; |
|
|
|
|
|
|
|
|
|
gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), valid ); |
|
|
|
|
gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), gxvalid ); |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
FT_Byte nGlyphInClass[256]; |
|
|
|
@ -1022,9 +1022,9 @@ |
|
|
|
|
FT_UShort stateSize, |
|
|
|
|
FT_Byte* maxState_p, |
|
|
|
|
FT_Byte* maxEntry_p, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_Bytes limit = table + *length_p; |
|
|
|
|
FT_Byte clazz; |
|
|
|
|
FT_Byte entry; |
|
|
|
@ -1076,7 +1076,7 @@ |
|
|
|
|
FT_Byte maxClassID, |
|
|
|
|
FT_Bytes statetable_table, |
|
|
|
|
FT_Bytes statetable_limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_Bytes limit = table + *length_p; |
|
|
|
@ -1166,13 +1166,13 @@ |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ( NULL != valid->statetable.entry_validate_func ) |
|
|
|
|
valid->statetable.entry_validate_func( state, |
|
|
|
|
flags, |
|
|
|
|
&glyphOffset, |
|
|
|
|
statetable_table, |
|
|
|
|
statetable_limit, |
|
|
|
|
valid ); |
|
|
|
|
if ( NULL != gxvalid->statetable.entry_validate_func ) |
|
|
|
|
gxvalid->statetable.entry_validate_func( state, |
|
|
|
|
flags, |
|
|
|
|
&glyphOffset, |
|
|
|
|
statetable_table, |
|
|
|
|
statetable_limit, |
|
|
|
|
gxvalid ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Exit: |
|
|
|
@ -1192,7 +1192,7 @@ |
|
|
|
|
FT_UShort* classTable_length_p, |
|
|
|
|
FT_UShort* stateArray_length_p, |
|
|
|
|
FT_UShort* entryTable_length_p, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_UShort o[3]; |
|
|
|
|
FT_UShort* l[3]; |
|
|
|
@ -1206,14 +1206,14 @@ |
|
|
|
|
l[1] = stateArray_length_p; |
|
|
|
|
l[2] = entryTable_length_p; |
|
|
|
|
|
|
|
|
|
gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, valid ); |
|
|
|
|
gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, gxvalid ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( void ) |
|
|
|
|
gxv_StateTable_validate( FT_Bytes table, |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_UShort stateSize; |
|
|
|
|
FT_UShort classTable; /* offset to Class(Sub)Table */ |
|
|
|
@ -1250,11 +1250,11 @@ |
|
|
|
|
if ( stateSize > 0xFF ) |
|
|
|
|
FT_INVALID_DATA; |
|
|
|
|
|
|
|
|
|
if ( valid->statetable.optdata_load_func != NULL ) |
|
|
|
|
valid->statetable.optdata_load_func( p, limit, valid ); |
|
|
|
|
if ( gxvalid->statetable.optdata_load_func != NULL ) |
|
|
|
|
gxvalid->statetable.optdata_load_func( p, limit, gxvalid ); |
|
|
|
|
|
|
|
|
|
if ( valid->statetable.subtable_setup_func != NULL) |
|
|
|
|
setup_func = valid->statetable.subtable_setup_func; |
|
|
|
|
if ( gxvalid->statetable.subtable_setup_func != NULL) |
|
|
|
|
setup_func = gxvalid->statetable.subtable_setup_func; |
|
|
|
|
else |
|
|
|
|
setup_func = gxv_StateTable_subtable_setup; |
|
|
|
|
|
|
|
|
@ -1265,7 +1265,7 @@ |
|
|
|
|
&classTable_length, |
|
|
|
|
&stateArray_length, |
|
|
|
|
&entryTable_length, |
|
|
|
|
valid ); |
|
|
|
|
gxvalid ); |
|
|
|
|
|
|
|
|
|
GXV_TRACE(( "StateTable Subtables\n" )); |
|
|
|
|
|
|
|
|
@ -1274,7 +1274,7 @@ |
|
|
|
|
&classTable_length, |
|
|
|
|
stateSize, |
|
|
|
|
&maxClassID, |
|
|
|
|
valid ); |
|
|
|
|
gxvalid ); |
|
|
|
|
else |
|
|
|
|
maxClassID = (FT_Byte)( stateSize - 1 ); |
|
|
|
|
|
|
|
|
@ -1285,7 +1285,7 @@ |
|
|
|
|
stateSize, |
|
|
|
|
&maxState, |
|
|
|
|
&maxEntry, |
|
|
|
|
valid ); |
|
|
|
|
gxvalid ); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
#if 0 |
|
|
|
@ -1306,7 +1306,7 @@ |
|
|
|
|
maxClassID, |
|
|
|
|
table, |
|
|
|
|
limit, |
|
|
|
|
valid ); |
|
|
|
|
gxvalid ); |
|
|
|
|
|
|
|
|
|
GXV_EXIT; |
|
|
|
|
} |
|
|
|
@ -1322,7 +1322,7 @@ |
|
|
|
|
FT_ULong* classTable_length_p, |
|
|
|
|
FT_ULong* stateArray_length_p, |
|
|
|
|
FT_ULong* entryTable_length_p, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_ULong o[3]; |
|
|
|
|
FT_ULong* l[3]; |
|
|
|
@ -1336,21 +1336,21 @@ |
|
|
|
|
l[1] = stateArray_length_p; |
|
|
|
|
l[2] = entryTable_length_p; |
|
|
|
|
|
|
|
|
|
gxv_set_length_by_ulong_offset( o, l, buff, 3, table_size, valid ); |
|
|
|
|
gxv_set_length_by_ulong_offset( o, l, buff, 3, table_size, gxvalid ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
gxv_XClassTable_lookupval_validate( FT_UShort glyph, |
|
|
|
|
GXV_LookupValueCPtr value_p, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_UNUSED( glyph ); |
|
|
|
|
|
|
|
|
|
if ( value_p->u >= valid->xstatetable.nClasses ) |
|
|
|
|
if ( value_p->u >= gxvalid->xstatetable.nClasses ) |
|
|
|
|
FT_INVALID_DATA; |
|
|
|
|
if ( value_p->u > valid->xstatetable.maxClassID ) |
|
|
|
|
valid->xstatetable.maxClassID = value_p->u; |
|
|
|
|
if ( value_p->u > gxvalid->xstatetable.maxClassID ) |
|
|
|
|
gxvalid->xstatetable.maxClassID = value_p->u; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1384,7 +1384,7 @@ |
|
|
|
|
gxv_XClassTable_lookupfmt4_transit( FT_UShort relative_gindex, |
|
|
|
|
GXV_LookupValueCPtr base_value_p, |
|
|
|
|
FT_Bytes lookuptbl_limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p; |
|
|
|
|
FT_Bytes limit; |
|
|
|
@ -1395,7 +1395,7 @@ |
|
|
|
|
offset = (FT_UShort)( base_value_p->u + |
|
|
|
|
relative_gindex * sizeof ( FT_UShort ) ); |
|
|
|
|
|
|
|
|
|
p = valid->lookuptbl_head + offset; |
|
|
|
|
p = gxvalid->lookuptbl_head + offset; |
|
|
|
|
limit = lookuptbl_limit; |
|
|
|
|
|
|
|
|
|
GXV_LIMIT_CHECK ( 2 ); |
|
|
|
@ -1412,7 +1412,7 @@ |
|
|
|
|
FT_ULong stateSize, |
|
|
|
|
FT_UShort* maxState_p, |
|
|
|
|
FT_UShort* maxEntry_p, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_Bytes limit = table + *length_p; |
|
|
|
@ -1463,7 +1463,7 @@ |
|
|
|
|
FT_UShort maxClassID, |
|
|
|
|
FT_Bytes xstatetable_table, |
|
|
|
|
FT_Bytes xstatetable_limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_Bytes p = table; |
|
|
|
|
FT_Bytes limit = table + *length_p; |
|
|
|
@ -1540,13 +1540,13 @@ |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ( NULL != valid->xstatetable.entry_validate_func ) |
|
|
|
|
valid->xstatetable.entry_validate_func( state, |
|
|
|
|
flags, |
|
|
|
|
&glyphOffset, |
|
|
|
|
xstatetable_table, |
|
|
|
|
xstatetable_limit, |
|
|
|
|
valid ); |
|
|
|
|
if ( NULL != gxvalid->xstatetable.entry_validate_func ) |
|
|
|
|
gxvalid->xstatetable.entry_validate_func( state, |
|
|
|
|
flags, |
|
|
|
|
&glyphOffset, |
|
|
|
|
xstatetable_table, |
|
|
|
|
xstatetable_limit, |
|
|
|
|
gxvalid ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Exit: |
|
|
|
@ -1559,7 +1559,7 @@ |
|
|
|
|
FT_LOCAL_DEF( void ) |
|
|
|
|
gxv_XStateTable_validate( FT_Bytes table, |
|
|
|
|
FT_Bytes limit, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
/* StateHeader members */ |
|
|
|
|
FT_ULong classTable; /* offset to Class(Sub)Table */ |
|
|
|
@ -1582,26 +1582,26 @@ |
|
|
|
|
GXV_TRACE(( "XStateTable header\n" )); |
|
|
|
|
|
|
|
|
|
GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); |
|
|
|
|
valid->xstatetable.nClasses = FT_NEXT_ULONG( p ); |
|
|
|
|
gxvalid->xstatetable.nClasses = FT_NEXT_ULONG( p ); |
|
|
|
|
classTable = FT_NEXT_ULONG( p ); |
|
|
|
|
stateArray = FT_NEXT_ULONG( p ); |
|
|
|
|
entryTable = FT_NEXT_ULONG( p ); |
|
|
|
|
|
|
|
|
|
GXV_TRACE(( "nClasses =0x%08x\n", valid->xstatetable.nClasses )); |
|
|
|
|
GXV_TRACE(( "nClasses =0x%08x\n", gxvalid->xstatetable.nClasses )); |
|
|
|
|
GXV_TRACE(( "offset to classTable=0x%08x\n", classTable )); |
|
|
|
|
GXV_TRACE(( "offset to stateArray=0x%08x\n", stateArray )); |
|
|
|
|
GXV_TRACE(( "offset to entryTable=0x%08x\n", entryTable )); |
|
|
|
|
|
|
|
|
|
if ( valid->xstatetable.nClasses > 0xFFFFU ) |
|
|
|
|
if ( gxvalid->xstatetable.nClasses > 0xFFFFU ) |
|
|
|
|
FT_INVALID_DATA; |
|
|
|
|
|
|
|
|
|
GXV_TRACE(( "StateTable Subtables\n" )); |
|
|
|
|
|
|
|
|
|
if ( valid->xstatetable.optdata_load_func != NULL ) |
|
|
|
|
valid->xstatetable.optdata_load_func( p, limit, valid ); |
|
|
|
|
if ( gxvalid->xstatetable.optdata_load_func != NULL ) |
|
|
|
|
gxvalid->xstatetable.optdata_load_func( p, limit, gxvalid ); |
|
|
|
|
|
|
|
|
|
if ( valid->xstatetable.subtable_setup_func != NULL ) |
|
|
|
|
setup_func = valid->xstatetable.subtable_setup_func; |
|
|
|
|
if ( gxvalid->xstatetable.subtable_setup_func != NULL ) |
|
|
|
|
setup_func = gxvalid->xstatetable.subtable_setup_func; |
|
|
|
|
else |
|
|
|
|
setup_func = gxv_XStateTable_subtable_setup; |
|
|
|
|
|
|
|
|
@ -1612,37 +1612,37 @@ |
|
|
|
|
&classTable_length, |
|
|
|
|
&stateArray_length, |
|
|
|
|
&entryTable_length, |
|
|
|
|
valid ); |
|
|
|
|
gxvalid ); |
|
|
|
|
|
|
|
|
|
if ( classTable != 0 ) |
|
|
|
|
{ |
|
|
|
|
valid->xstatetable.maxClassID = 0; |
|
|
|
|
valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; |
|
|
|
|
valid->lookupval_func = gxv_XClassTable_lookupval_validate; |
|
|
|
|
valid->lookupfmt4_trans = gxv_XClassTable_lookupfmt4_transit; |
|
|
|
|
gxvalid->xstatetable.maxClassID = 0; |
|
|
|
|
gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; |
|
|
|
|
gxvalid->lookupval_func = gxv_XClassTable_lookupval_validate; |
|
|
|
|
gxvalid->lookupfmt4_trans = gxv_XClassTable_lookupfmt4_transit; |
|
|
|
|
gxv_LookupTable_validate( table + classTable, |
|
|
|
|
table + classTable + classTable_length, |
|
|
|
|
valid ); |
|
|
|
|
gxvalid ); |
|
|
|
|
#if 0 |
|
|
|
|
if ( valid->subtable_length < classTable_length ) |
|
|
|
|
classTable_length = valid->subtable_length; |
|
|
|
|
if ( gxvalid->subtable_length < classTable_length ) |
|
|
|
|
classTable_length = gxvalid->subtable_length; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
/* XXX: check range? */ |
|
|
|
|
valid->xstatetable.maxClassID = |
|
|
|
|
(FT_UShort)( valid->xstatetable.nClasses - 1 ); |
|
|
|
|
gxvalid->xstatetable.maxClassID = |
|
|
|
|
(FT_UShort)( gxvalid->xstatetable.nClasses - 1 ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ( stateArray != 0 ) |
|
|
|
|
gxv_XStateArray_validate( table + stateArray, |
|
|
|
|
&stateArray_length, |
|
|
|
|
valid->xstatetable.maxClassID, |
|
|
|
|
valid->xstatetable.nClasses, |
|
|
|
|
gxvalid->xstatetable.maxClassID, |
|
|
|
|
gxvalid->xstatetable.nClasses, |
|
|
|
|
&maxState, |
|
|
|
|
&maxEntry, |
|
|
|
|
valid ); |
|
|
|
|
gxvalid ); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
#if 0 |
|
|
|
@ -1659,10 +1659,10 @@ |
|
|
|
|
&entryTable_length, |
|
|
|
|
maxEntry, |
|
|
|
|
stateArray_length, |
|
|
|
|
valid->xstatetable.maxClassID, |
|
|
|
|
gxvalid->xstatetable.maxClassID, |
|
|
|
|
table, |
|
|
|
|
limit, |
|
|
|
|
valid ); |
|
|
|
|
gxvalid ); |
|
|
|
|
|
|
|
|
|
GXV_EXIT; |
|
|
|
|
} |
|
|
|
@ -1719,7 +1719,7 @@ |
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( void ) |
|
|
|
|
gxv_odtect_validate( GXV_odtect_Range odtect, |
|
|
|
|
GXV_Validator valid ) |
|
|
|
|
GXV_Validator gxvalid ) |
|
|
|
|
{ |
|
|
|
|
FT_UInt i, j; |
|
|
|
|
|
|
|
|
|