diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-04-14 19:05:09 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-04-14 19:31:31 +0100 |
commit | 005596907fc9b62fa4bf72ec35e0d1a1a242ef93 (patch) | |
tree | 04589d4d62606f041cb3002657182f727c12aaf3 /src/cairo-xlib-xcb-surface.c | |
parent | 8afd4e4c3db53159d1e5b6f13d3355cb5fb1750b (diff) | |
download | cairo-005596907fc9b62fa4bf72ec35e0d1a1a242ef93.tar.gz |
xlib: Don't operate on an error object inside setters.
Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=599574
The backend API manipulated the surface prior to checking whether it was
an inert error surface - and in the event of an error surface, tried to
overwrite it's error status.
Diffstat (limited to 'src/cairo-xlib-xcb-surface.c')
-rw-r--r-- | src/cairo-xlib-xcb-surface.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/cairo-xlib-xcb-surface.c b/src/cairo-xlib-xcb-surface.c index a8e0cde7b..3dbb9bd91 100644 --- a/src/cairo-xlib-xcb-surface.c +++ b/src/cairo-xlib-xcb-surface.c @@ -396,6 +396,9 @@ cairo_xlib_surface_set_size (cairo_surface_t *abstract_surface, cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *) abstract_surface; cairo_status_t status; + if (unlikely (abstract_surface->status)) + return; + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { status = _cairo_surface_set_error (abstract_surface, CAIRO_STATUS_SURFACE_TYPE_MISMATCH); @@ -414,6 +417,9 @@ cairo_xlib_surface_set_drawable (cairo_surface_t *abstract_surface, cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *)abstract_surface; cairo_status_t status; + if (unlikely (abstract_surface->status)) + return; + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { status = _cairo_surface_set_error (abstract_surface, CAIRO_STATUS_SURFACE_TYPE_MISMATCH); |