diff options
author | Uli Schlachter <psychon@znc.in> | 2020-12-26 16:09:16 +0100 |
---|---|---|
committer | Uli Schlachter <psychon@znc.in> | 2021-01-07 17:27:39 +0100 |
commit | 66c9911850257b2d42a6abf756baed16fe1ae9d5 (patch) | |
tree | fbfe5abdf56318643f2d37ef1d27dab7f950b849 /src/cairo-surface-snapshot.c | |
parent | 979382dd302bbab73d8c81740ddd72afc31a8ea8 (diff) | |
download | cairo-66c9911850257b2d42a6abf756baed16fe1ae9d5.tar.gz |
Slightly improve dealing with error snapshots
An error in _cairo_surface_snapshot_copy_on_write() results in a
snapshot in an error state and the snapshot's ->target could now point
to a surface from _cairo_surface_create_in_error(). These surfaces e.g.
have ->backend == NULL. Thus, anything looking at ->backend->type now
explodes. This commit deals with two places which caused segfaults in
this situation.
There is no test case for this, because
_cairo_surface_snapshot_copy_on_write() really is not supposed to fail.
Found-while-investigating: https://gitlab.freedesktop.org/cairo/cairo/-/issues/448
Signed-off-by: Uli Schlachter <psychon@znc.in>
Diffstat (limited to 'src/cairo-surface-snapshot.c')
-rw-r--r-- | src/cairo-surface-snapshot.c | 4 |
1 files changed, 3 insertions, 1 deletions
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; |