mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 07:38:22 +02:00
type1-subset: fix error handling.
This fixes potenial memory leak and leaving font face locked on error.
This commit is contained in:
parent
01a133167c
commit
17b4496ae9
1 changed files with 23 additions and 11 deletions
|
|
@ -107,6 +107,7 @@ _cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font,
|
|||
cairo_bool_t hex_encode)
|
||||
{
|
||||
cairo_ft_unscaled_font_t *ft_unscaled_font;
|
||||
cairo_status_t status;
|
||||
FT_Face face;
|
||||
PS_FontInfoRec font_info;
|
||||
cairo_type1_font_subset_t *font;
|
||||
|
|
@ -116,12 +117,16 @@ _cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font,
|
|||
|
||||
face = _cairo_ft_unscaled_font_lock_face (ft_unscaled_font);
|
||||
|
||||
if (FT_Get_PS_Font_Info(face, &font_info) != 0)
|
||||
return CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
if (FT_Get_PS_Font_Info(face, &font_info) != 0) {
|
||||
status = CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
font = calloc (sizeof (cairo_type1_font_subset_t), 1);
|
||||
if (font == NULL)
|
||||
return CAIRO_STATUS_NO_MEMORY;
|
||||
if (font == NULL) {
|
||||
status = CAIRO_STATUS_NO_MEMORY;
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
font->base.unscaled_font = _cairo_unscaled_font_reference (unscaled_font);
|
||||
font->base.num_glyphs = face->num_glyphs;
|
||||
|
|
@ -132,8 +137,10 @@ _cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font,
|
|||
font->base.ascent = face->ascender;
|
||||
font->base.descent = face->descender;
|
||||
font->base.base_font = strdup (face->family_name);
|
||||
if (font->base.base_font == NULL)
|
||||
goto fail1;
|
||||
if (font->base.base_font == NULL) {
|
||||
status = CAIRO_STATUS_NO_MEMORY;
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
for (i = 0, j = 0; font->base.base_font[j]; j++) {
|
||||
if (font->base.base_font[j] == ' ')
|
||||
|
|
@ -143,8 +150,10 @@ _cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font,
|
|||
font->base.base_font[i] = '\0';
|
||||
|
||||
font->glyphs = calloc (face->num_glyphs, sizeof font->glyphs[0]);
|
||||
if (font->glyphs == NULL)
|
||||
goto fail2;
|
||||
if (font->glyphs == NULL) {
|
||||
status = CAIRO_STATUS_NO_MEMORY;
|
||||
goto fail3;
|
||||
}
|
||||
|
||||
font->hex_encode = hex_encode;
|
||||
font->num_glyphs = 0;
|
||||
|
|
@ -159,12 +168,15 @@ _cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font,
|
|||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
|
||||
fail2:
|
||||
fail3:
|
||||
free (font->base.base_font);
|
||||
fail1:
|
||||
fail2:
|
||||
_cairo_unscaled_font_destroy (unscaled_font);
|
||||
free (font);
|
||||
fail1:
|
||||
_cairo_ft_unscaled_font_unlock_face (ft_unscaled_font);
|
||||
|
||||
return CAIRO_STATUS_NO_MEMORY;
|
||||
return status;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue