[gxvalid] Cleanup.
Some invalid, overrunning, unrecommended non-zero values are cared in paranoid validation mode only. There are many lines looking like: if ( valid->root->level >= FT_VALIDATE_PARANOID ) FT_INVALID_xxx; To simplify them, GXV_SET_ERR_IF_PARANOID( err ) is introduced for more paranoid validation in future. * src/gxvalid/gxvcommn.h (IS_PARANOID_VALIDATION): New macro to assure valid->root->level is more or equal to FT_VALIDATE_PARANOID. (GXV_SET_ERR_IF_PARANOID): New macro to raise an error if in paranoid validation. * src/gxvalid/gxvcommn.c: Use GXV_SET_ERR_IF_PARANOID(). * src/gxvalid/gxvfeat.c: Ditto. * src/gxvalid/gxvjust.c: Ditto. * src/gxvalid/gxvkern.c: Ditto. * src/gxvalid/gxvmort.c: Ditto. * src/gxvalid/gxvmort0.c: Ditto. * src/gxvalid/gxvmort1.c: Ditto. * src/gxvalid/gxvmort2.c: Ditto. * src/gxvalid/gxvmorx1.c: Ditto. * src/gxvalid/gxvmorx2.c: Ditto.
This commit is contained in:
parent
f6f9b66781
commit
75b91a49aa
29
ChangeLog
29
ChangeLog
|
@ -1,3 +1,32 @@
|
||||||
|
2011-06-14 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
|
||||||
|
|
||||||
|
[gxvalid] Cleanup.
|
||||||
|
|
||||||
|
Some invalid, overrunning, unrecommended non-zero values
|
||||||
|
are cared in paranoid validation mode only. There are
|
||||||
|
many lines looking like:
|
||||||
|
|
||||||
|
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
||||||
|
FT_INVALID_xxx;
|
||||||
|
|
||||||
|
To simplify them, GXV_SET_ERR_IF_PARANOID( err ) is
|
||||||
|
introduced for more paranoid validation in future.
|
||||||
|
|
||||||
|
* src/gxvalid/gxvcommn.h (IS_PARANOID_VALIDATION):
|
||||||
|
New macro to assure valid->root->level is more or
|
||||||
|
equal to FT_VALIDATE_PARANOID. (GXV_SET_ERR_IF_PARANOID):
|
||||||
|
New macro to raise an error if in paranoid validation.
|
||||||
|
* src/gxvalid/gxvcommn.c: Use GXV_SET_ERR_IF_PARANOID().
|
||||||
|
* src/gxvalid/gxvfeat.c: Ditto.
|
||||||
|
* src/gxvalid/gxvjust.c: Ditto.
|
||||||
|
* src/gxvalid/gxvkern.c: Ditto.
|
||||||
|
* src/gxvalid/gxvmort.c: Ditto.
|
||||||
|
* src/gxvalid/gxvmort0.c: Ditto.
|
||||||
|
* src/gxvalid/gxvmort1.c: Ditto.
|
||||||
|
* src/gxvalid/gxvmort2.c: Ditto.
|
||||||
|
* src/gxvalid/gxvmorx1.c: Ditto.
|
||||||
|
* src/gxvalid/gxvmorx2.c: Ditto.
|
||||||
|
|
||||||
2011-06-14 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
|
2011-06-14 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
|
||||||
|
|
||||||
[gxvalid] Fix gcc4.6 compiler warnings in gxvtrak.c.
|
[gxvalid] Fix gcc4.6 compiler warnings in gxvtrak.c.
|
||||||
|
|
|
@ -304,8 +304,7 @@
|
||||||
binSrchHeader->unitSize, binSrchHeader->nUnits,
|
binSrchHeader->unitSize, binSrchHeader->nUnits,
|
||||||
searchRange, entrySelector, rangeShift ));
|
searchRange, entrySelector, rangeShift ));
|
||||||
|
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,8 +441,7 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( "too short, glyphs %d - %d are missing\n",
|
GXV_TRACE(( "too short, glyphs %d - %d are missing\n",
|
||||||
i, valid->face->num_glyphs ));
|
i, valid->face->num_glyphs ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,8 +529,7 @@
|
||||||
GXV_TRACE(( "reverse ordered segment specification:"
|
GXV_TRACE(( "reverse ordered segment specification:"
|
||||||
" lastGlyph[%d]=%d < lastGlyph[%d]=%d\n",
|
" lastGlyph[%d]=%d < lastGlyph[%d]=%d\n",
|
||||||
unit, lastGlyph, unit - 1 , gid ));
|
unit, lastGlyph, unit - 1 , gid ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( lastGlyph < firstGlyph )
|
if ( lastGlyph < firstGlyph )
|
||||||
|
@ -540,8 +537,7 @@
|
||||||
GXV_TRACE(( "reverse ordered range specification at unit %d:",
|
GXV_TRACE(( "reverse ordered range specification at unit %d:",
|
||||||
" lastGlyph %d < firstGlyph %d ",
|
" lastGlyph %d < firstGlyph %d ",
|
||||||
unit, lastGlyph, firstGlyph ));
|
unit, lastGlyph, firstGlyph ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
|
|
||||||
if ( valid->root->level == FT_VALIDATE_TIGHT )
|
if ( valid->root->level == FT_VALIDATE_TIGHT )
|
||||||
continue; /* ftxvalidator silently skips such an entry */
|
continue; /* ftxvalidator silently skips such an entry */
|
||||||
|
@ -604,8 +600,7 @@
|
||||||
GXV_TRACE(( "reverse ordered segment specification:"
|
GXV_TRACE(( "reverse ordered segment specification:"
|
||||||
" lastGlyph[%d]=%d < lastGlyph[%d]=%d\n",
|
" lastGlyph[%d]=%d < lastGlyph[%d]=%d\n",
|
||||||
unit, lastGlyph, unit - 1 , gid ));
|
unit, lastGlyph, unit - 1 , gid ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( lastGlyph < firstGlyph )
|
if ( lastGlyph < firstGlyph )
|
||||||
|
@ -613,8 +608,7 @@
|
||||||
GXV_TRACE(( "reverse ordered range specification at unit %d:",
|
GXV_TRACE(( "reverse ordered range specification at unit %d:",
|
||||||
" lastGlyph %d < firstGlyph %d ",
|
" lastGlyph %d < firstGlyph %d ",
|
||||||
unit, lastGlyph, firstGlyph ));
|
unit, lastGlyph, firstGlyph ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
|
|
||||||
if ( valid->root->level == FT_VALIDATE_TIGHT )
|
if ( valid->root->level == FT_VALIDATE_TIGHT )
|
||||||
continue; /* ftxvalidator silently skips such an entry */
|
continue; /* ftxvalidator silently skips such an entry */
|
||||||
|
@ -705,8 +699,7 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( "current gid 0x%04x < previous gid 0x%04x\n",
|
GXV_TRACE(( "current gid 0x%04x < previous gid 0x%04x\n",
|
||||||
glyph, prev_glyph ));
|
glyph, prev_glyph ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
}
|
}
|
||||||
prev_glyph = glyph;
|
prev_glyph = glyph;
|
||||||
|
|
||||||
|
@ -834,8 +827,7 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( " gxv_glyphid_check() gid overflow: num_glyphs %d < %d\n",
|
GXV_TRACE(( " gxv_glyphid_check() gid overflow: num_glyphs %d < %d\n",
|
||||||
face->num_glyphs, gid ));
|
face->num_glyphs, gid ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1101,8 +1093,7 @@
|
||||||
|
|
||||||
if ( ( maxEntry + 1 ) * entrySize > *length_p )
|
if ( ( maxEntry + 1 ) * entrySize > *length_p )
|
||||||
{
|
{
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_TOO_SHORT );
|
||||||
FT_INVALID_TOO_SHORT;
|
|
||||||
|
|
||||||
/* ftxvalidator and FontValidator both warn and continue */
|
/* ftxvalidator and FontValidator both warn and continue */
|
||||||
maxEntry = (FT_Byte)( *length_p / entrySize - 1 );
|
maxEntry = (FT_Byte)( *length_p / entrySize - 1 );
|
||||||
|
@ -1126,8 +1117,7 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( " newState offset 0x%04x is out of stateArray\n",
|
GXV_TRACE(( " newState offset 0x%04x is out of stateArray\n",
|
||||||
newState ));
|
newState ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1135,8 +1125,7 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( " newState offset 0x%04x is not aligned to %d-classes\n",
|
GXV_TRACE(( " newState offset 0x%04x is not aligned to %d-classes\n",
|
||||||
newState, 1 + maxClassID ));
|
newState, 1 + maxClassID ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1173,8 +1162,7 @@
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
|
||||||
FT_INVALID_FORMAT;
|
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1503,8 +1491,7 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( " newState index 0x%04x points out of stateArray\n",
|
GXV_TRACE(( " newState index 0x%04x points out of stateArray\n",
|
||||||
newState_idx ));
|
newState_idx ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) );
|
state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) );
|
||||||
|
@ -1513,8 +1500,7 @@
|
||||||
FT_TRACE4(( "-> new state = %d (supposed)\n"
|
FT_TRACE4(( "-> new state = %d (supposed)\n"
|
||||||
"but newState index 0x%04x is not aligned to %d-classes\n",
|
"but newState index 0x%04x is not aligned to %d-classes\n",
|
||||||
state, newState_idx, 1 + maxClassID ));
|
state, newState_idx, 1 + maxClassID ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) )
|
switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) )
|
||||||
|
@ -1548,8 +1534,7 @@
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
|
||||||
FT_INVALID_FORMAT;
|
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,8 @@ FT_BEGIN_HEADER
|
||||||
|
|
||||||
#undef GXV_LOAD_UNUSED_VARS /* debug purpose */
|
#undef GXV_LOAD_UNUSED_VARS /* debug purpose */
|
||||||
|
|
||||||
|
#define IS_PARANOID_VALIDATION ( valid->root->level >= FT_VALIDATE_PARANOID )
|
||||||
|
#define GXV_SET_ERR_IF_PARANOID( err ) { if ( IS_PARANOID_VALIDATION ) ( err ); }
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
|
@ -92,8 +92,7 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( "feature number %d is out of range %d\n",
|
GXV_TRACE(( "feature number %d is out of range %d\n",
|
||||||
feature, gxv_feat_registry_length ));
|
feature, gxv_feat_registry_length ));
|
||||||
if ( valid->root->level == FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,8 +100,7 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( "feature number %d is in defined range but doesn't exist\n",
|
GXV_TRACE(( "feature number %d is in defined range but doesn't exist\n",
|
||||||
feature ));
|
feature ));
|
||||||
if ( valid->root->level == FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,9 +220,8 @@
|
||||||
if ( settingTable < reserved_size )
|
if ( settingTable < reserved_size )
|
||||||
FT_INVALID_OFFSET;
|
FT_INVALID_OFFSET;
|
||||||
|
|
||||||
if ( valid->root->level == FT_VALIDATE_PARANOID &&
|
if ( ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 )
|
||||||
( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
|
|
||||||
exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS );
|
exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS );
|
||||||
if ( exclusive )
|
if ( exclusive )
|
||||||
|
@ -252,9 +249,8 @@
|
||||||
{
|
{
|
||||||
gxv_feat_setting_validate( p, limit, exclusive, valid );
|
gxv_feat_setting_validate( p, limit, exclusive, valid );
|
||||||
|
|
||||||
if ( valid->root->level == FT_VALIDATE_PARANOID &&
|
if ( (FT_Int)GXV_FEAT_DATA( setting ) <= last_setting )
|
||||||
(FT_Int)GXV_FEAT_DATA( setting ) <= last_setting )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
|
||||||
FT_INVALID_FORMAT;
|
|
||||||
|
|
||||||
last_setting = (FT_Int)GXV_FEAT_DATA( setting );
|
last_setting = (FT_Int)GXV_FEAT_DATA( setting );
|
||||||
/* setting + nameIndex */
|
/* setting + nameIndex */
|
||||||
|
@ -312,8 +308,8 @@
|
||||||
featureNameCount = FT_NEXT_USHORT( p );
|
featureNameCount = FT_NEXT_USHORT( p );
|
||||||
GXV_TRACE(( " (featureNameCount = %d)\n", featureNameCount ));
|
GXV_TRACE(( " (featureNameCount = %d)\n", featureNameCount ));
|
||||||
|
|
||||||
if ( valid->root->level != FT_VALIDATE_PARANOID )
|
if ( !( IS_PARANOID_VALIDATION ) )
|
||||||
p += 6; /* skip (none) and (none) */
|
p += 6; /* skip (none) and (none) */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( FT_NEXT_USHORT( p ) != 0 )
|
if ( FT_NEXT_USHORT( p ) != 0 )
|
||||||
|
@ -329,9 +325,8 @@
|
||||||
{
|
{
|
||||||
gxv_feat_name_validate( p, limit, valid );
|
gxv_feat_name_validate( p, limit, valid );
|
||||||
|
|
||||||
if ( valid->root->level == FT_VALIDATE_PARANOID &&
|
if ( (FT_Int)GXV_FEAT_DATA( feature ) <= last_feature )
|
||||||
(FT_Int)GXV_FEAT_DATA( feature ) <= last_feature )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
|
||||||
FT_INVALID_FORMAT;
|
|
||||||
|
|
||||||
last_feature = GXV_FEAT_DATA( feature );
|
last_feature = GXV_FEAT_DATA( feature );
|
||||||
p += 2 + 2 + 4 + 2 + 2;
|
p += 2 + 2 + 4 + 2 + 2;
|
||||||
|
|
|
@ -77,8 +77,7 @@
|
||||||
GXV_TRACE(( "just table includes too large %s"
|
GXV_TRACE(( "just table includes too large %s"
|
||||||
" GID=%d > %d (in maxp)\n",
|
" GID=%d > %d (in maxp)\n",
|
||||||
msg_tag, gid, valid->face->num_glyphs ));
|
msg_tag, gid, valid->face->num_glyphs ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -113,13 +112,12 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* According to Apple spec, only 7bits in justClass is used */
|
/* According to Apple spec, only 7bits in justClass is used */
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID &&
|
if ( ( justClass & 0xFFFFFF80 ) != 0 )
|
||||||
( justClass & 0xFFFFFF80 ) != 0 )
|
|
||||||
{
|
{
|
||||||
GXV_TRACE(( "just table includes non-zero value"
|
GXV_TRACE(( "just table includes non-zero value"
|
||||||
" in unused justClass higher bits"
|
" in unused justClass higher bits"
|
||||||
" of WidthDeltaPair" ));
|
" of WidthDeltaPair" ));
|
||||||
FT_INVALID_DATA;
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
}
|
}
|
||||||
|
|
||||||
valid->subtable_length = p - table;
|
valid->subtable_length = p - table;
|
||||||
|
@ -202,12 +200,11 @@
|
||||||
#endif
|
#endif
|
||||||
decomposedCount = FT_NEXT_USHORT( p );
|
decomposedCount = FT_NEXT_USHORT( p );
|
||||||
|
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID &&
|
if ( lowerLimit >= upperLimit )
|
||||||
lowerLimit >= upperLimit )
|
|
||||||
{
|
{
|
||||||
GXV_TRACE(( "just table includes invalid range spec:"
|
GXV_TRACE(( "just table includes invalid range spec:"
|
||||||
" lowerLimit(%d) > upperLimit(%d)\n" ));
|
" lowerLimit(%d) > upperLimit(%d)\n" ));
|
||||||
FT_INVALID_DATA;
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( i = 0; i < decomposedCount; i++ )
|
for ( i = 0; i < decomposedCount; i++ )
|
||||||
|
@ -303,7 +300,7 @@
|
||||||
else if ( noStretchValue > maximumLimit )
|
else if ( noStretchValue > maximumLimit )
|
||||||
GXV_TRACE(( "type4:noStretchValue 0x%08x > maximumLimit 0x%08x\n",
|
GXV_TRACE(( "type4:noStretchValue 0x%08x > maximumLimit 0x%08x\n",
|
||||||
noStretchValue, maximumLimit ));
|
noStretchValue, maximumLimit ));
|
||||||
else if ( valid->root->level < FT_VALIDATE_PARANOID )
|
else if ( !IS_PARANOID_VALIDATION )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
FT_INVALID_DATA;
|
FT_INVALID_DATA;
|
||||||
|
@ -353,9 +350,8 @@
|
||||||
actionLength = FT_NEXT_ULONG( p );
|
actionLength = FT_NEXT_ULONG( p );
|
||||||
|
|
||||||
/* actionClass is related with justClass using 7bit only */
|
/* actionClass is related with justClass using 7bit only */
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID &&
|
if ( ( actionClass & 0xFF80 ) != 0 )
|
||||||
( actionClass & 0xFF80 ) != 0 )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
|
|
||||||
if ( actionType == 0 )
|
if ( actionType == 0 )
|
||||||
gxv_just_actSubrecord_type0_validate( p, limit, valid );
|
gxv_just_actSubrecord_type0_validate( p, limit, valid );
|
||||||
|
|
|
@ -491,8 +491,7 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( "maxGID=%d, but glyphCount=%d\n",
|
GXV_TRACE(( "maxGID=%d, but glyphCount=%d\n",
|
||||||
valid->face->num_glyphs, glyphCount ));
|
valid->face->num_glyphs, glyphCount ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( flags != 0 )
|
if ( flags != 0 )
|
||||||
|
|
|
@ -47,16 +47,14 @@
|
||||||
GXV_TRACE(( "featureType %d is out of registered range, "
|
GXV_TRACE(( "featureType %d is out of registered range, "
|
||||||
"setting %d is unchecked\n",
|
"setting %d is unchecked\n",
|
||||||
f->featureType, f->featureSetting ));
|
f->featureType, f->featureSetting ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
}
|
}
|
||||||
else if ( !gxv_feat_registry[f->featureType].existence )
|
else if ( !gxv_feat_registry[f->featureType].existence )
|
||||||
{
|
{
|
||||||
GXV_TRACE(( "featureType %d is within registered area "
|
GXV_TRACE(( "featureType %d is within registered area "
|
||||||
"but undefined, setting %d is unchecked\n",
|
"but undefined, setting %d is unchecked\n",
|
||||||
f->featureType, f->featureSetting ));
|
f->featureType, f->featureSetting ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -74,8 +72,7 @@
|
||||||
if ( f->featureSetting > nSettings_max )
|
if ( f->featureSetting > nSettings_max )
|
||||||
{
|
{
|
||||||
GXV_TRACE(( "out of defined range %d", nSettings_max ));
|
GXV_TRACE(( "out of defined range %d", nSettings_max ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
}
|
}
|
||||||
GXV_TRACE(( "\n" ));
|
GXV_TRACE(( "\n" ));
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,23 +102,20 @@
|
||||||
{
|
{
|
||||||
GXV_TRACE(( " [odd] a glyph is marked as the first and last"
|
GXV_TRACE(( " [odd] a glyph is marked as the first and last"
|
||||||
" in Indic rearrangement\n" ));
|
" in Indic rearrangement\n" ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( markFirst > 0 && dontAdvance > 0 )
|
if ( markFirst > 0 && dontAdvance > 0 )
|
||||||
{
|
{
|
||||||
GXV_TRACE(( " [odd] the first glyph is marked as dontAdvance"
|
GXV_TRACE(( " [odd] the first glyph is marked as dontAdvance"
|
||||||
" in Indic rearrangement\n" ));
|
" in Indic rearrangement\n" ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( 0 < reserved )
|
if ( 0 < reserved )
|
||||||
{
|
{
|
||||||
GXV_TRACE(( " non-zero bits found in reserved range\n" ));
|
GXV_TRACE(( " non-zero bits found in reserved range\n" ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
GXV_TRACE(( "\n" ));
|
GXV_TRACE(( "\n" ));
|
||||||
|
|
|
@ -163,8 +163,7 @@
|
||||||
if ( 0 < reserved )
|
if ( 0 < reserved )
|
||||||
{
|
{
|
||||||
GXV_TRACE(( " non-zero bits found in reserved range\n" ));
|
GXV_TRACE(( " non-zero bits found in reserved range\n" ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gxv_mort_subtable_type1_offset_to_subst_validate( markOffset,
|
gxv_mort_subtable_type1_offset_to_subst_validate( markOffset,
|
||||||
|
@ -208,8 +207,7 @@
|
||||||
GXV_TRACE(( "substTable include a strange gid[%d]=%d >"
|
GXV_TRACE(( "substTable include a strange gid[%d]=%d >"
|
||||||
" out of define range (%d..%d)\n",
|
" out of define range (%d..%d)\n",
|
||||||
i, dst_gid, valid->min_gid, valid->max_gid ));
|
i, dst_gid, valid->min_gid, valid->max_gid ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -155,8 +155,7 @@
|
||||||
ligActionOffset, lat_base - p ));
|
ligActionOffset, lat_base - p ));
|
||||||
|
|
||||||
/* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */
|
/* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
}
|
}
|
||||||
else if ( lat_limit < p )
|
else if ( lat_limit < p )
|
||||||
{
|
{
|
||||||
|
@ -164,8 +163,7 @@
|
||||||
ligActionOffset, p - lat_limit ));
|
ligActionOffset, p - lat_limit ));
|
||||||
|
|
||||||
/* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */
|
/* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -192,8 +190,7 @@
|
||||||
" 2 x offset < ligatureTable (%d byte rewind)\n",
|
" 2 x offset < ligatureTable (%d byte rewind)\n",
|
||||||
offset, optdata->ligatureTable - offset * 2 ));
|
offset, optdata->ligatureTable - offset * 2 ));
|
||||||
|
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
} else if ( offset * 2 >
|
} else if ( offset * 2 >
|
||||||
optdata->ligatureTable + optdata->ligatureTable_length )
|
optdata->ligatureTable + optdata->ligatureTable_length )
|
||||||
{
|
{
|
||||||
|
@ -204,8 +201,7 @@
|
||||||
optdata->ligatureTable + optdata->ligatureTable_length
|
optdata->ligatureTable + optdata->ligatureTable_length
|
||||||
- offset * 2 ));
|
- offset * 2 ));
|
||||||
|
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -268,9 +264,8 @@
|
||||||
GXV_LIMIT_CHECK( 2 );
|
GXV_LIMIT_CHECK( 2 );
|
||||||
lig_gid = FT_NEXT_USHORT( p );
|
lig_gid = FT_NEXT_USHORT( p );
|
||||||
|
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID &&
|
if ( valid->face->num_glyphs < lig_gid )
|
||||||
valid->face->num_glyphs < lig_gid )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GXV_EXIT;
|
GXV_EXIT;
|
||||||
|
|
|
@ -140,8 +140,7 @@
|
||||||
if ( 0 < reserved )
|
if ( 0 < reserved )
|
||||||
{
|
{
|
||||||
GXV_TRACE(( " non-zero bits found in reserved range\n" ));
|
GXV_TRACE(( " non-zero bits found in reserved range\n" ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
|
||||||
FT_INVALID_DATA;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GXV_TRACE(( "markIndex = %d, currentIndex = %d\n",
|
GXV_TRACE(( "markIndex = %d, currentIndex = %d\n",
|
||||||
|
|
|
@ -194,8 +194,7 @@
|
||||||
" too negative offset moving all GID"
|
" too negative offset moving all GID"
|
||||||
" below defined range: 0x%04x\n",
|
" below defined range: 0x%04x\n",
|
||||||
offset & 0xFFFFU ));
|
offset & 0xFFFFU ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
}
|
}
|
||||||
else if ( ( offset & 0x3FFF0000UL ) == 0x0000000UL )
|
else if ( ( offset & 0x3FFF0000UL ) == 0x0000000UL )
|
||||||
{
|
{
|
||||||
|
@ -206,15 +205,13 @@
|
||||||
" too large offset moving all GID"
|
" too large offset moving all GID"
|
||||||
" over defined range: 0x%04x\n",
|
" over defined range: 0x%04x\n",
|
||||||
offset & 0xFFFFU ));
|
offset & 0xFFFFU ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GXV_TRACE(( "ligature action table includes"
|
GXV_TRACE(( "ligature action table includes"
|
||||||
" invalid offset to add to 16-bit GID:"
|
" invalid offset to add to 16-bit GID:"
|
||||||
" 0x%08x\n", offset ));
|
" 0x%08x\n", offset ));
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
|
||||||
FT_INVALID_OFFSET;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,9 +279,8 @@
|
||||||
|
|
||||||
GXV_LIMIT_CHECK( 2 );
|
GXV_LIMIT_CHECK( 2 );
|
||||||
lig_gid = FT_NEXT_USHORT( p );
|
lig_gid = FT_NEXT_USHORT( p );
|
||||||
if ( valid->root->level >= FT_VALIDATE_PARANOID &&
|
if ( lig_gid < valid->face->num_glyphs )
|
||||||
lig_gid < valid->face->num_glyphs )
|
GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
|
||||||
FT_INVALID_GLYPH_ID;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue