type1-subset: fix error handling.

This fixes potenial memory leak and leaving font face locked on error.
This commit is contained in:
Jinghua Luo 2007-02-14 11:52:11 +08:00
parent 01a133167c
commit 17b4496ae9

View file

@ -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