gdkcairo: Bail if surface is in error

Don't try to paint onto an error surface. This happens for example when
gdk_cairo_set_source_pixbuf() is called with a pixbuf that is too big
for Cairo to handle.

Spotted by Christian Boxdörfer
This commit is contained in:
Benjamin Otte 2015-02-21 00:03:49 +01:00
parent 0ab48fcc42
commit 40f2af665d
3 changed files with 46 additions and 2 deletions

View File

@ -185,6 +185,9 @@ gdk_cairo_surface_paint_pixbuf (cairo_surface_t *surface,
int n_channels;
int j;
if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS)
return;
/* This function can't just copy any pixbuf to any surface, be
* sure to read the invariants here before calling it */

View File

@ -18,10 +18,11 @@ LDADD = \
#TEST_PROGS += check-gdk-cairo
TEST_PROGS += \
rgba \
encoding \
cairo \
display \
encoding \
keysyms \
rgba \
$(NULL)
CLEANFILES = \

40
testsuite/gdk/cairo.c Normal file
View File

@ -0,0 +1,40 @@
#include <gdk/gdk.h>
static void
test_set_source_big_pixbuf (void)
{
cairo_surface_t *surface;
GdkPixbuf *pixbuf;
cairo_t *cr;
#define WAY_TOO_BIG 65540
/* Check that too big really is to big.
* If this check fails, somebody improved Cairo and this test is useless.
*/
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, WAY_TOO_BIG, 1);
g_assert_cmpint (cairo_surface_status (surface), !=, CAIRO_STATUS_SUCCESS);
cairo_surface_destroy (surface);
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
cr = cairo_create (surface);
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, WAY_TOO_BIG, 1);
gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
g_assert_cmpint (cairo_status (cr), !=, CAIRO_STATUS_SUCCESS);
g_object_unref (pixbuf);
cairo_destroy (cr);
cairo_surface_destroy (surface);
}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
gdk_init (&argc, &argv);
g_test_add_func ("/drawing/set-source-big-pixbuf", test_set_source_big_pixbuf);
return g_test_run ();
}