summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cairo-recording-surface.c5
-rw-r--r--src/cairo-surface-snapshot.c4
2 files changed, 8 insertions, 1 deletions
diff --git a/src/cairo-recording-surface.c b/src/cairo-recording-surface.c
index 144fa9745..a65f84e45 100644
--- a/src/cairo-recording-surface.c
+++ b/src/cairo-recording-surface.c
@@ -1784,6 +1784,11 @@ _cairo_recording_surface_merge_source_attributes (cairo_recording_surface_t *su
if (_cairo_surface_is_snapshot (surf))
free_me = surf = _cairo_surface_snapshot_get_target (surf);
+ if (unlikely (surf->status))
+ // There was some kind of error and the surface could be a nil error
+ // surface with various "problems" (e.g. ->backend == NULL).
+ return;
+
if (surf->type == CAIRO_SURFACE_TYPE_RECORDING) {
cairo_recording_surface_t *rec_surf = (cairo_recording_surface_t *) surf;
diff --git a/src/cairo-surface-snapshot.c b/src/cairo-surface-snapshot.c
index a8b8c0e45..b2908f6bc 100644
--- a/src/cairo-surface-snapshot.c
+++ b/src/cairo-surface-snapshot.c
@@ -71,7 +71,9 @@ _cairo_surface_snapshot_flush (void *abstract_surface, unsigned flags)
cairo_status_t status;
target = _cairo_surface_snapshot_get_target (&surface->base);
- status = _cairo_surface_flush (target, flags);
+ status = target->status;
+ if (status == CAIRO_STATUS_SUCCESS)
+ status = _cairo_surface_flush (target, flags);
cairo_surface_destroy (target);
return status;