forked from minhngoc25a/freetype2
[base] Improve error handling in `FT_GlyphLoader_CheckPoints`.
If `FT_GlyphLoader_CreateExtra` returns an error (and a couple of other places), `FT_GlyphLoader_CheckPoints` would propagate the error immediately, rather than cleaning up the partially set up `FT_GlyphLoader`. As a consequence, a subsequent attempt to create a glyph could result in a crash. * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Ensure all the error conditions exits are consistent, eventually calling `FT_GlyphLoader_Reset`.
This commit is contained in:
parent
55a97b0cb1
commit
1a242558be
|
@ -217,7 +217,7 @@
|
||||||
|
|
||||||
error = FT_GlyphLoader_CreateExtra( loader );
|
error = FT_GlyphLoader_CreateExtra( loader );
|
||||||
if ( error )
|
if ( error )
|
||||||
return error;
|
goto Exit;
|
||||||
|
|
||||||
/* check points & tags */
|
/* check points & tags */
|
||||||
new_max = (FT_UInt)base->n_points + (FT_UInt)current->n_points +
|
new_max = (FT_UInt)base->n_points + (FT_UInt)current->n_points +
|
||||||
|
@ -229,7 +229,10 @@
|
||||||
new_max = FT_PAD_CEIL( new_max, 8 );
|
new_max = FT_PAD_CEIL( new_max, 8 );
|
||||||
|
|
||||||
if ( new_max > FT_OUTLINE_POINTS_MAX )
|
if ( new_max > FT_OUTLINE_POINTS_MAX )
|
||||||
return FT_THROW( Array_Too_Large );
|
{
|
||||||
|
error = FT_THROW( Array_Too_Large );
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||
|
if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||
|
||||||
FT_RENEW_ARRAY( base->tags, old_max, new_max ) )
|
FT_RENEW_ARRAY( base->tags, old_max, new_max ) )
|
||||||
|
@ -254,7 +257,7 @@
|
||||||
|
|
||||||
error = FT_GlyphLoader_CreateExtra( loader );
|
error = FT_GlyphLoader_CreateExtra( loader );
|
||||||
if ( error )
|
if ( error )
|
||||||
return error;
|
goto Exit;
|
||||||
|
|
||||||
/* check contours */
|
/* check contours */
|
||||||
old_max = loader->max_contours;
|
old_max = loader->max_contours;
|
||||||
|
@ -265,7 +268,10 @@
|
||||||
new_max = FT_PAD_CEIL( new_max, 4 );
|
new_max = FT_PAD_CEIL( new_max, 4 );
|
||||||
|
|
||||||
if ( new_max > FT_OUTLINE_CONTOURS_MAX )
|
if ( new_max > FT_OUTLINE_CONTOURS_MAX )
|
||||||
return FT_THROW( Array_Too_Large );
|
{
|
||||||
|
error = FT_THROW( Array_Too_Large );
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )
|
if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
|
Loading…
Reference in New Issue