Index: src/cairo.h
===================================================================
RCS file: /cvs/cairo/cairo/src/cairo.h,v
retrieving revision 1.144
diff -u -p -r1.144 cairo.h
--- src/cairo.h	1 Aug 2005 20:33:47 -0000	1.144
+++ src/cairo.h	3 Aug 2005 01:18:49 -0000
@@ -998,6 +996,11 @@ cairo_get_target (cairo_t *cr);
  *	    case CAIRO_PATH_CLOSE_PATH:
  *		do_close_path_things ();
  *		break;
+ *	    case CAIRO_PATH_NOOP:
+ *		// do nothing, simply skip
+ *		break;
+ *	    default:
+ *		error_invalid_path ();
  *	    }
  *	}
  *
@@ -1008,7 +1011,8 @@ typedef enum _cairo_path_data_type {
     CAIRO_PATH_MOVE_TO,
     CAIRO_PATH_LINE_TO,
     CAIRO_PATH_CURVE_TO,
-    CAIRO_PATH_CLOSE_PATH
+    CAIRO_PATH_CLOSE_PATH,
+    CAIRO_PATH_NOOP
 } cairo_path_data_type_t;
 
 typedef union {
Index: src/cairo-path-data.c
===================================================================
RCS file: /cvs/cairo/cairo/src/cairo-path-data.c,v
retrieving revision 1.9
diff -u -p -r1.9 cairo-path-data.c
--- src/cairo-path-data.c	28 Jul 2005 16:46:38 -0000	1.9
+++ src/cairo-path-data.c	3 Aug 2005 01:18:49 -0000
@@ -454,28 +454,32 @@ _cairo_path_data_append_to_context (cair
 	p = &path->data[i];
 	switch (p->header.type) {
 	case CAIRO_PATH_MOVE_TO:
+	    if (p->header.length < 2)
+		return CAIRO_STATUS_INVALID_PATH_DATA;
 	    cairo_move_to (cr,
 			   p[1].point.x, p[1].point.y);
-	    if (p->header.length != 2)
-		return CAIRO_STATUS_INVALID_PATH_DATA;
 	    break;
 	case CAIRO_PATH_LINE_TO:
+	    if (p->header.length < 2)
+		return CAIRO_STATUS_INVALID_PATH_DATA;
 	    cairo_line_to (cr,
 			   p[1].point.x, p[1].point.y);
-	    if (p->header.length != 2)
-		return CAIRO_STATUS_INVALID_PATH_DATA;
 	    break;
 	case CAIRO_PATH_CURVE_TO:
+	    if (p->header.length < 4)
+		return CAIRO_STATUS_INVALID_PATH_DATA;
 	    cairo_curve_to (cr,
 			    p[1].point.x, p[1].point.y,
 			    p[2].point.x, p[2].point.y,
 			    p[3].point.x, p[3].point.y);
-	    if (p->header.length != 4)
-		return CAIRO_STATUS_INVALID_PATH_DATA;
 	    break;
 	case CAIRO_PATH_CLOSE_PATH:
+	    if (p->header.length < 1)
+		return CAIRO_STATUS_INVALID_PATH_DATA;
 	    cairo_close_path (cr);
-	    if (p->header.length != 1)
+	    break;
+	case CAIRO_PATH_NOOP:
+	    if (p->header.length < 1)
 		return CAIRO_STATUS_INVALID_PATH_DATA;
 	    break;
 	default:
