[truetype] Refine some GX sanity tests.
Use the `gvar' table size instead of the remaining bytes in the stream. * src/truetype/ttgxvar.h (GX_BlendRec): New field `gvar_size'. * src/truetype/ttgxvar.c (ft_var_load_gvar): Set `gvar_size'. (ft_var_readpackedpoints, ft_var_readpackeddeltas: New argument `size'. (tt_face_vary_cvt, TT_Vary_Apply_Glyph_Deltas): Updated.
This commit is contained in:
parent
052f6c5649
commit
43a96eb26f
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
||||||
|
2015-10-13 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
|
[truetype] Refine some GX sanity tests.
|
||||||
|
|
||||||
|
Use the `gvar' table size instead of the remaining bytes in the
|
||||||
|
stream.
|
||||||
|
|
||||||
|
* src/truetype/ttgxvar.h (GX_BlendRec): New field `gvar_size'.
|
||||||
|
|
||||||
|
* src/truetype/ttgxvar.c (ft_var_load_gvar): Set `gvar_size'.
|
||||||
|
(ft_var_readpackedpoints, ft_var_readpackeddeltas: New argument
|
||||||
|
`size'.
|
||||||
|
(tt_face_vary_cvt, TT_Vary_Apply_Glyph_Deltas): Updated.
|
||||||
|
|
||||||
2015-10-13 Werner Lemberg <wl@gnu.org>
|
2015-10-13 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
[truetype] Another GX sanity test.
|
[truetype] Another GX sanity test.
|
||||||
|
|
|
@ -112,6 +112,8 @@
|
||||||
/* <Input> */
|
/* <Input> */
|
||||||
/* stream :: The data stream. */
|
/* stream :: The data stream. */
|
||||||
/* */
|
/* */
|
||||||
|
/* size :: The size of the table holding the data. */
|
||||||
|
/* */
|
||||||
/* <Output> */
|
/* <Output> */
|
||||||
/* point_cnt :: The number of points read. A zero value means that */
|
/* point_cnt :: The number of points read. A zero value means that */
|
||||||
/* all points in the glyph will be affected, without */
|
/* all points in the glyph will be affected, without */
|
||||||
|
@ -123,6 +125,7 @@
|
||||||
/* */
|
/* */
|
||||||
static FT_UShort*
|
static FT_UShort*
|
||||||
ft_var_readpackedpoints( FT_Stream stream,
|
ft_var_readpackedpoints( FT_Stream stream,
|
||||||
|
FT_ULong size,
|
||||||
FT_UInt *point_cnt )
|
FT_UInt *point_cnt )
|
||||||
{
|
{
|
||||||
FT_UShort *points = NULL;
|
FT_UShort *points = NULL;
|
||||||
|
@ -149,7 +152,7 @@
|
||||||
n |= FT_GET_BYTE();
|
n |= FT_GET_BYTE();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( n > stream->size - stream->pos )
|
if ( n > size )
|
||||||
{
|
{
|
||||||
FT_TRACE1(( "ft_var_readpackedpoints: number of points too large\n" ));
|
FT_TRACE1(( "ft_var_readpackedpoints: number of points too large\n" ));
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -218,6 +221,8 @@
|
||||||
/* <Input> */
|
/* <Input> */
|
||||||
/* stream :: The data stream. */
|
/* stream :: The data stream. */
|
||||||
/* */
|
/* */
|
||||||
|
/* size :: The size of the table holding the data. */
|
||||||
|
/* */
|
||||||
/* delta_cnt :: The number of deltas to be read. */
|
/* delta_cnt :: The number of deltas to be read. */
|
||||||
/* */
|
/* */
|
||||||
/* <Return> */
|
/* <Return> */
|
||||||
|
@ -228,6 +233,7 @@
|
||||||
/* */
|
/* */
|
||||||
static FT_Short*
|
static FT_Short*
|
||||||
ft_var_readpackeddeltas( FT_Stream stream,
|
ft_var_readpackeddeltas( FT_Stream stream,
|
||||||
|
FT_ULong size,
|
||||||
FT_UInt delta_cnt )
|
FT_UInt delta_cnt )
|
||||||
{
|
{
|
||||||
FT_Short *deltas = NULL;
|
FT_Short *deltas = NULL;
|
||||||
|
@ -239,7 +245,7 @@
|
||||||
FT_UNUSED( error );
|
FT_UNUSED( error );
|
||||||
|
|
||||||
|
|
||||||
if ( delta_cnt > stream->size - stream->pos )
|
if ( delta_cnt > size )
|
||||||
{
|
{
|
||||||
FT_TRACE1(( "ft_var_readpackeddeltas: number of points too large\n" ));
|
FT_TRACE1(( "ft_var_readpackeddeltas: number of points too large\n" ));
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -497,6 +503,7 @@
|
||||||
|
|
||||||
FT_TRACE2(( "loaded\n" ));
|
FT_TRACE2(( "loaded\n" ));
|
||||||
|
|
||||||
|
blend->gvar_size = table_len;
|
||||||
blend->tuplecount = gvar_head.globalCoordCount;
|
blend->tuplecount = gvar_head.globalCoordCount;
|
||||||
blend->gv_glyphcnt = gvar_head.glyphCount;
|
blend->gv_glyphcnt = gvar_head.glyphCount;
|
||||||
offsetToData = gvar_start + gvar_head.offsetToData;
|
offsetToData = gvar_start + gvar_head.offsetToData;
|
||||||
|
@ -1466,8 +1473,11 @@
|
||||||
|
|
||||||
FT_Stream_SeekSet( stream, offsetToData );
|
FT_Stream_SeekSet( stream, offsetToData );
|
||||||
|
|
||||||
localpoints = ft_var_readpackedpoints( stream, &point_count );
|
localpoints = ft_var_readpackedpoints( stream,
|
||||||
|
table_len,
|
||||||
|
&point_count );
|
||||||
deltas = ft_var_readpackeddeltas( stream,
|
deltas = ft_var_readpackeddeltas( stream,
|
||||||
|
table_len,
|
||||||
point_count == 0 ? face->cvt_size
|
point_count == 0 ? face->cvt_size
|
||||||
: point_count );
|
: point_count );
|
||||||
if ( localpoints == NULL || deltas == NULL )
|
if ( localpoints == NULL || deltas == NULL )
|
||||||
|
@ -1867,7 +1877,7 @@
|
||||||
offsetToData = FT_GET_USHORT();
|
offsetToData = FT_GET_USHORT();
|
||||||
|
|
||||||
/* rough sanity test */
|
/* rough sanity test */
|
||||||
if ( offsetToData + tupleCount * 4 > stream->size - stream->pos )
|
if ( offsetToData + tupleCount * 4 > blend->gvar_size )
|
||||||
{
|
{
|
||||||
FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
|
FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
|
||||||
" invalid glyph variation array header\n" ));
|
" invalid glyph variation array header\n" ));
|
||||||
|
@ -1884,7 +1894,9 @@
|
||||||
|
|
||||||
FT_Stream_SeekSet( stream, offsetToData );
|
FT_Stream_SeekSet( stream, offsetToData );
|
||||||
|
|
||||||
sharedpoints = ft_var_readpackedpoints( stream, &spoint_count );
|
sharedpoints = ft_var_readpackedpoints( stream,
|
||||||
|
blend->gvar_size,
|
||||||
|
&spoint_count );
|
||||||
offsetToData = FT_Stream_FTell( stream );
|
offsetToData = FT_Stream_FTell( stream );
|
||||||
|
|
||||||
FT_Stream_SeekSet( stream, here );
|
FT_Stream_SeekSet( stream, here );
|
||||||
|
@ -1951,7 +1963,9 @@
|
||||||
{
|
{
|
||||||
FT_Stream_SeekSet( stream, offsetToData );
|
FT_Stream_SeekSet( stream, offsetToData );
|
||||||
|
|
||||||
localpoints = ft_var_readpackedpoints( stream, &point_count );
|
localpoints = ft_var_readpackedpoints( stream,
|
||||||
|
blend->gvar_size,
|
||||||
|
&point_count );
|
||||||
points = localpoints;
|
points = localpoints;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1961,9 +1975,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
deltas_x = ft_var_readpackeddeltas( stream,
|
deltas_x = ft_var_readpackeddeltas( stream,
|
||||||
|
blend->gvar_size,
|
||||||
point_count == 0 ? n_points
|
point_count == 0 ? n_points
|
||||||
: point_count );
|
: point_count );
|
||||||
deltas_y = ft_var_readpackeddeltas( stream,
|
deltas_y = ft_var_readpackeddeltas( stream,
|
||||||
|
blend->gvar_size,
|
||||||
point_count == 0 ? n_points
|
point_count == 0 ? n_points
|
||||||
: point_count );
|
: point_count );
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,8 @@ FT_BEGIN_HEADER
|
||||||
FT_UInt gv_glyphcnt;
|
FT_UInt gv_glyphcnt;
|
||||||
FT_ULong* glyphoffsets;
|
FT_ULong* glyphoffsets;
|
||||||
|
|
||||||
|
FT_ULong gvar_size;
|
||||||
|
|
||||||
} GX_BlendRec;
|
} GX_BlendRec;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue