[Commit] cairo/src cairo_font.c, 1.8, 1.9 cairo_gstate.c, 1.17, 1.18 cairoint.h, 1.25, 1.26

Carl Worth commit at keithp.com
Wed Oct 1 18:34:22 PDT 2003


Committed by: cworth

Update of /local/src/CVS/cairo/src
In directory home.keithp.com:/tmp/cvs-serv31662/src

Modified Files:
	cairo_font.c cairo_gstate.c cairoint.h 
Log Message:
Fix to gracefully handle a NULL pointer for gstate->font

Index: cairo_font.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_font.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- cairo_font.c	1 Oct 2003 01:56:22 -0000	1.8
+++ cairo_font.c	2 Oct 2003 00:34:19 -0000	1.9
@@ -27,18 +27,26 @@
 
 #include "cairoint.h"
 
-void
+cairo_int_status_t
 _cairo_font_init (cairo_font_t *font, const struct cairo_font_backend *backend)
 {
+    if (font == NULL)
+	return CAIRO_INT_STATUS_NULL_POINTER;
+
     font->key = (unsigned char *) strdup (CAIRO_FONT_KEY_DEFAULT);
     cairo_matrix_set_identity (&font->matrix);
 
     font->backend = backend;
+
+    return CAIRO_STATUS_SUCCESS;
 }
 
-cairo_status_t
+cairo_int_status_t
 _cairo_font_init_copy (cairo_font_t *font, cairo_font_t *other)
 {
+    if (other == NULL)
+	return CAIRO_INT_STATUS_NULL_POINTER;
+
     if (other->key) {
 	font->key = (unsigned char *) strdup ((char *) other->key);
 	if (font->key == NULL)
@@ -54,8 +62,8 @@
 cairo_font_t *
 _cairo_font_copy (cairo_font_t *font)
 {
-    if (!font->backend->copy)
-	return 0;
+    if (font == NULL || font->backend->copy == NULL)
+	return NULL;
 
     return font->backend->copy (font);
 }
@@ -63,6 +71,9 @@
 void
 _cairo_font_fini (cairo_font_t *font)
 {
+    if (font == NULL)
+	return;
+
     if (font->key)
 	free (font->key);
     font->key = NULL;
@@ -73,9 +84,12 @@
 	font->backend->close (font);
 }
 
-cairo_status_t
+cairo_int_status_t
 _cairo_font_select (cairo_font_t *font, const char *key)
 {
+    if (font == NULL)
+	return CAIRO_INT_STATUS_NULL_POINTER;
+
     if (font->backend->close)
 	font->backend->close (font);
 
@@ -89,28 +103,34 @@
     return CAIRO_STATUS_SUCCESS;
 }
 
-cairo_status_t
+cairo_int_status_t
 _cairo_font_scale (cairo_font_t *font, double scale)
 {
+    if (font == NULL)
+	return CAIRO_INT_STATUS_NULL_POINTER;
+
     cairo_matrix_scale (&font->matrix, scale, scale);
 
     return CAIRO_STATUS_SUCCESS;
 }
 
-cairo_status_t
+cairo_int_status_t
 _cairo_font_transform (cairo_font_t *font,
 		       double a, double b,
 		       double c, double d)
 {
     cairo_matrix_t m;
 
+    if (font == NULL)
+	return CAIRO_INT_STATUS_NULL_POINTER;
+
     cairo_matrix_set_affine (&m, a, b, c, d, 0, 0);
     cairo_matrix_multiply (&font->matrix, &m, &font->matrix);
 
     return CAIRO_STATUS_SUCCESS;
 }
 
-cairo_status_t
+cairo_int_status_t
 _cairo_font_text_extents (cairo_font_t *font,
 			  cairo_matrix_t *ctm,
 			  const unsigned char *utf8,
@@ -118,13 +138,16 @@
 			  double *width, double *height,
 			  double *dx, double *dy)
 {
+    if (font == NULL)
+	return CAIRO_INT_STATUS_NULL_POINTER;
+
     if (!font->backend->text_extents)
 	return CAIRO_STATUS_SUCCESS;
 
     return font->backend->text_extents (font, ctm, utf8, x, y, width, height, dx, dy);
 }
 
-cairo_status_t
+cairo_int_status_t
 _cairo_font_show_text (cairo_font_t		*font,
 		       cairo_matrix_t		*ctm,
 		       cairo_operator_t		operator,
@@ -134,6 +157,9 @@
 		       double			y,
 		       const unsigned char	*utf8)
 {
+    if (font == NULL)
+	return CAIRO_INT_STATUS_NULL_POINTER;
+
     if (!font->backend->show_text)
 	return CAIRO_STATUS_SUCCESS;
 

Index: cairo_gstate.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_gstate.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- cairo_gstate.c	1 Oct 2003 01:56:22 -0000	1.17
+++ cairo_gstate.c	2 Oct 2003 00:34:19 -0000	1.18
@@ -120,11 +120,13 @@
 	    return CAIRO_STATUS_NO_MEMORY;
 	memcpy (gstate->dash, other->dash, other->num_dashes * sizeof (double));
     }
-    
-    gstate->font = _cairo_font_copy (other->font);
-    if (!gstate->font) {
-	status = CAIRO_STATUS_NO_MEMORY;
-	goto CLEANUP_DASHES;
+
+    if (other->font) {
+	gstate->font = _cairo_font_copy (other->font);
+	if (!gstate->font) {
+	    status = CAIRO_STATUS_NO_MEMORY;
+	    goto CLEANUP_DASHES;
+	}
     }
 
     cairo_surface_reference (gstate->surface);

Index: cairoint.h
===================================================================
RCS file: /local/src/CVS/cairo/src/cairoint.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- cairoint.h	1 Oct 2003 01:56:22 -0000	1.25
+++ cairoint.h	2 Oct 2003 00:34:20 -0000	1.26
@@ -128,7 +128,8 @@
    from cairo_status_t. Oh well, without that, I'll use this bogus 1000
    offset */
 typedef enum cairo_int_status {
-    CAIRO_INT_STATUS_DEGENERATE = 1000
+    CAIRO_INT_STATUS_DEGENERATE = 1000,
+    CAIRO_INT_STATUS_NULL_POINTER
 } cairo_int_status_t;
 
 typedef enum cairo_path_op {
@@ -673,10 +674,10 @@
 _cairo_color_set_alpha (cairo_color_t *color, double alpha);
 
 /* cairo_font.c */
-extern void __internal_linkage
+extern cairo_int_status_t __internal_linkage
 _cairo_font_init (cairo_font_t *font, const struct cairo_font_backend *backend);
 
-extern cairo_status_t __internal_linkage
+extern cairo_int_status_t __internal_linkage
 _cairo_font_init_copy (cairo_font_t *font, cairo_font_t *other);
 
 extern cairo_font_t * __internal_linkage
@@ -685,18 +686,18 @@
 extern void __internal_linkage
 _cairo_font_fini (cairo_font_t *font);
 
-extern cairo_status_t __internal_linkage
+extern cairo_int_status_t __internal_linkage
 _cairo_font_select (cairo_font_t *font, const char *key);
 
-extern cairo_status_t __internal_linkage
+extern cairo_int_status_t __internal_linkage
 _cairo_font_scale (cairo_font_t *font, double scale);
 
-extern cairo_status_t __internal_linkage
+extern cairo_int_status_t __internal_linkage
 _cairo_font_transform (cairo_font_t *font,
 		       double a, double b,
 		       double c, double d);
 
-extern cairo_status_t __internal_linkage
+extern cairo_int_status_t __internal_linkage
 _cairo_font_text_extents (cairo_font_t *font,
 			  cairo_matrix_t *ctm,
 			  const unsigned char *utf8,
@@ -704,7 +705,7 @@
 			  double *width, double *height,
 			  double *dx, double *dy);
 
-extern cairo_status_t __internal_linkage
+extern cairo_int_status_t __internal_linkage
 _cairo_font_show_text (cairo_font_t		*font,
 		       cairo_matrix_t		*ctm,
 		       cairo_operator_t		operator,




More information about the Commit mailing list