diff --git a/src/cairo-image-compositor.c b/src/cairo-image-compositor.c index 79ad69f68..4f8aaed99 100644 --- a/src/cairo-image-compositor.c +++ b/src/cairo-image-compositor.c @@ -2610,14 +2610,14 @@ _inplace_src_spans (void *abstract_renderer, int y, int h, unsigned num_spans) { cairo_image_span_renderer_t *r = abstract_renderer; - uint8_t *m; + uint8_t *m, *base = (uint8_t*)pixman_image_get_data(r->mask); int x0; if (num_spans == 0) return CAIRO_STATUS_SUCCESS; x0 = spans[0].x; - m = r->_buf; + m = base; do { int len = spans[1].x - spans[0].x; if (len >= r->u.composite.run_length && spans[0].coverage == 0xff) { @@ -2655,7 +2655,7 @@ _inplace_src_spans (void *abstract_renderer, int y, int h, spans[0].x, y, spans[1].x - spans[0].x, h); - m = r->_buf; + m = base; x0 = spans[1].x; } else if (spans[0].coverage == 0x0) { if (spans[0].x != x0) { @@ -2684,7 +2684,7 @@ _inplace_src_spans (void *abstract_renderer, int y, int h, #endif } - m = r->_buf; + m = base; x0 = spans[1].x; } else { *m++ = spans[0].coverage; diff --git a/test/Makefile.sources b/test/Makefile.sources index 7eb73647f..86494348d 100644 --- a/test/Makefile.sources +++ b/test/Makefile.sources @@ -34,6 +34,7 @@ test_sources = \ bug-source-cu.c \ bug-extents.c \ bug-seams.c \ + bug-image-compositor.c \ caps.c \ checkerboard.c \ caps-joins.c \ diff --git a/test/bug-image-compositor.c b/test/bug-image-compositor.c new file mode 100644 index 000000000..304ea089c --- /dev/null +++ b/test/bug-image-compositor.c @@ -0,0 +1,66 @@ +/* + * Copyright © 2020 Uli Schlachter, Heiko Lewin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Uli Schlachter + * Author: Heiko Lewin + */ +#include "cairo-test.h" + + +/* This test reproduces an overflow of a mask-buffer in cairo-image-compositor.c */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0., 0., 0.); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_set_line_width (cr, 1.); + + cairo_pattern_t *p = cairo_pattern_create_linear (0, 0, width, height); + cairo_pattern_add_color_stop_rgb (p, 0, 0.99, 1, 1); + cairo_pattern_add_color_stop_rgb (p, 1, 1, 1, 1); + cairo_set_source (cr, p); + cairo_pattern_destroy(p); + + cairo_move_to (cr, 0.5, -1); + for (int i = 0; i < width; i+=3) { + cairo_rel_line_to (cr, 2, 2); + cairo_rel_line_to (cr, 1, -2); + } + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + + +CAIRO_TEST (bug_image_compositor, + "Crash in image-compositor", + "stroke, stress", /* keywords */ + NULL, /* requirements */ + 10000, 1, + NULL, draw) + diff --git a/test/meson.build b/test/meson.build index 0e2e23673..b8149a7bc 100644 --- a/test/meson.build +++ b/test/meson.build @@ -32,6 +32,7 @@ test_sources = [ 'bug-bo-ricotz.c', 'bug-source-cu.c', 'bug-extents.c', + 'bug-image-compositor.c', 'bug-seams.c', 'caps.c', 'checkerboard.c', diff --git a/test/reference/bug-image-compositor.ref.png b/test/reference/bug-image-compositor.ref.png new file mode 100644 index 000000000..939f659d2 Binary files /dev/null and b/test/reference/bug-image-compositor.ref.png differ