summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2007-05-10 17:17:30 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2007-05-10 17:18:27 +0100
commitab6a767cf476c98b466c62dd410d0f61f8dd6bbb (patch)
tree62f92fdda9030b11d62281df87bcb66865a584e5
parentaec92188f1cf4ca34e890b0a4266425532f669d4 (diff)
[cairo-scaled-font] Check for allocation failure.
cairo_scaled_font_create() returns a nil object on failure whereas a few callers were checking for NULL. Secondly review the public entry points for cairo_scaled_font_*() to ensure that all check that they will not attempt to overwrite the read-only nil object.
-rw-r--r--src/cairo-gstate.c7
-rw-r--r--src/cairo-scaled-font-subsets.c2
-rw-r--r--src/cairo-scaled-font.c10
-rw-r--r--src/cairo-type1-fallback.c2
4 files changed, 14 insertions, 7 deletions
diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c
index 3787aebc9..ad560cd8a 100644
--- a/src/cairo-gstate.c
+++ b/src/cairo-gstate.c
@@ -1464,11 +1464,10 @@ _cairo_gstate_ensure_scaled_font (cairo_gstate_t *gstate)
&gstate->font_matrix,
&gstate->ctm,
&options);
- if (gstate->scaled_font == NULL)
- return CAIRO_STATUS_NO_MEMORY;
- if (cairo_scaled_font_status (gstate->scaled_font))
- return cairo_scaled_font_status (gstate->scaled_font);
+ status = cairo_scaled_font_status (gstate->scaled_font);
+ if (status)
+ return status;
return CAIRO_STATUS_SUCCESS;
}
diff --git a/src/cairo-scaled-font-subsets.c b/src/cairo-scaled-font-subsets.c
index fa5a8b423..3489ee6be 100644
--- a/src/cairo-scaled-font-subsets.c
+++ b/src/cairo-scaled-font-subsets.c
@@ -531,6 +531,8 @@ _cairo_scaled_font_subsets_map_glyph (cairo_scaled_font_subsets_t *subsets,
&identity,
&identity,
&font_options);
+ if (unscaled_font->status)
+ return unscaled_font->status;
subset_glyph->is_scaled = FALSE;
type1_font = FALSE;
diff --git a/src/cairo-scaled-font.c b/src/cairo-scaled-font.c
index d6726b35d..40ff6988e 100644
--- a/src/cairo-scaled-font.c
+++ b/src/cairo-scaled-font.c
@@ -135,6 +135,9 @@ _cairo_scaled_font_set_error (cairo_scaled_font_t *scaled_font,
cairo_font_type_t
cairo_scaled_font_get_type (cairo_scaled_font_t *scaled_font)
{
+ if (scaled_font->ref_count == CAIRO_REF_COUNT_INVALID)
+ return CAIRO_FONT_TYPE_TOY;
+
return scaled_font->backend->type;
}
@@ -770,10 +773,13 @@ cairo_scaled_font_text_extents (cairo_scaled_font_t *scaled_font,
const char *utf8,
cairo_text_extents_t *extents)
{
- cairo_status_t status = CAIRO_STATUS_SUCCESS;
+ cairo_status_t status;
cairo_glyph_t *glyphs;
int num_glyphs;
+ if (scaled_font->status)
+ return;
+
status = _cairo_scaled_font_text_to_glyphs (scaled_font, 0., 0., utf8, &glyphs, &num_glyphs);
if (status) {
_cairo_scaled_font_set_error (scaled_font, status);
@@ -807,7 +813,7 @@ cairo_scaled_font_glyph_extents (cairo_scaled_font_t *scaled_font,
int num_glyphs,
cairo_text_extents_t *extents)
{
- cairo_status_t status = CAIRO_STATUS_SUCCESS;
+ cairo_status_t status;
int i;
double min_x = 0.0, min_y = 0.0, max_x = 0.0, max_y = 0.0;
cairo_bool_t visible = FALSE;
diff --git a/src/cairo-type1-fallback.c b/src/cairo-type1-fallback.c
index 3a0bd1249..387277785 100644
--- a/src/cairo-type1-fallback.c
+++ b/src/cairo-type1-fallback.c
@@ -106,7 +106,7 @@ cairo_type1_font_create (cairo_scaled_font_subset_t *scaled_font_subset,
&font_matrix,
&ctm,
&font_options);
- if (font->type1_scaled_font == NULL)
+ if (font->type1_scaled_font->status)
goto fail;
_cairo_array_init (&font->contents, sizeof (unsigned char));