From 03a820b173ed1fdef6ff14b4468f5dbc02ff59be Mon Sep 17 00:00:00 2001 From: Heiko Lewin Date: Tue, 15 Dec 2020 16:48:19 +0100 Subject: [PATCH 1/3] Fix mask usage in image-compositor --- src/cairo-image-compositor.c | 8 ++-- test/Makefile.sources | 1 + test/bug-image-compositor.c | 39 ++++++++++++++++++++ test/reference/bug-image-compositor.ref.png | Bin 0 -> 185 bytes 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 test/bug-image-compositor.c create mode 100644 test/reference/bug-image-compositor.ref.png 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/bug-image-compositor.c b/test/bug-image-compositor.c new file mode 100644 index 000000000..fc4fd370b --- /dev/null +++ b/test/bug-image-compositor.c @@ -0,0 +1,39 @@ +#include "cairo-test.h" + +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_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); + + cairo_pattern_destroy(p); + + return CAIRO_TEST_SUCCESS; +} + + +CAIRO_TEST (bug_image_compositor, + "Crash in image-compositor", + "stroke, stress", /* keywords */ + NULL, /* requirements */ + 10000, 1, + NULL, draw) + + From 8bc14a6bba3bc8a64ff0749c74d9b96305bf6429 Mon Sep 17 00:00:00 2001 From: Heiko Lewin Date: Tue, 15 Dec 2020 17:14:18 +0100 Subject: [PATCH 2/3] Minor cleanups --- test/bug-image-compositor.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/test/bug-image-compositor.c b/test/bug-image-compositor.c index fc4fd370b..304ea089c 100644 --- a/test/bug-image-compositor.c +++ b/test/bug-image-compositor.c @@ -1,5 +1,34 @@ +/* + * 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) { @@ -13,6 +42,7 @@ draw (cairo_t *cr, int width, int 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) { @@ -23,8 +53,6 @@ draw (cairo_t *cr, int width, int height) cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_stroke (cr); - cairo_pattern_destroy(p); - return CAIRO_TEST_SUCCESS; } @@ -36,4 +64,3 @@ CAIRO_TEST (bug_image_compositor, 10000, 1, NULL, draw) - -- GitLab