6 commits - src/cairo-pattern.c test/gradient-scale-crash.c test/meson.build

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri May 24 15:41:47 UTC 2024


 src/cairo-pattern.c         |    6 ++++
 test/gradient-scale-crash.c |   55 ++++++++++++++++++++++++++++++++++++++++++++
 test/meson.build            |    1 
 3 files changed, 62 insertions(+)

New commits:
commit f43dcc212deea499c901af2c6503f5145cc4e5da
Merge: 4796138f3 d163670f9
Author: Uli Schlachter <psychon at znc.in>
Date:   Fri May 24 15:41:38 2024 +0000

    Merge branch 'fix-gradient-scale-crash' into 'master'
    
    Fix "out of memory" when using linear gradient
    
    Closes #789
    
    See merge request cairo/cairo!535

commit d163670f975fe0c6df39944642f36e44cecb79b6
Merge: 820bb0ba7 d25318865
Author: Koichi Akabe <vbkaisetsu at gmail.com>
Date:   Wed May 22 10:19:50 2024 +0900

    Merge branch 'master' into fix-gradient-scale-crash

commit 820bb0ba7f5d9f916594219d4093073d33253ba1
Author: Emmanuele Bassi <ebassi at gmail.com>
Date:   Tue May 21 22:43:36 2024 +0000

    Apply 1 suggestion(s) to 1 file(s)
    
    Co-authored-by: Emmanuele Bassi <ebassi at gmail.com>

diff --git a/test/gradient-scale-crash.c b/test/gradient-scale-crash.c
index b073dc1b3..b265e429b 100644
--- a/test/gradient-scale-crash.c
+++ b/test/gradient-scale-crash.c
@@ -48,7 +48,7 @@ draw (cairo_t *cr, int width, int height)
 }
 
 CAIRO_TEST (gradient_scale_crash,
-	    "Exercises a bug found in scaling gradient pattern",
+	    "Verify fix for https://gitlab.freedesktop.org/cairo/cairo/-/issues/789",
 	    "gradient, pattern", /* keywords */
 	    NULL, /* requirements */
 	    0, 0,
commit ad93bbad1933efe11986be8614e3f8192d2dd2f9
Author: Koichi Akabe <vbkaisetsu at gmail.com>
Date:   Wed Feb 7 23:21:13 2024 +0900

    coding style

diff --git a/test/gradient-scale-crash.c b/test/gradient-scale-crash.c
index 269b6a457..b073dc1b3 100644
--- a/test/gradient-scale-crash.c
+++ b/test/gradient-scale-crash.c
@@ -29,16 +29,21 @@
 static cairo_test_status_t
 draw (cairo_t *cr, int width, int height)
 {
-    cairo_pattern_t *p = cairo_pattern_create_linear(0, 0, 0, 100);
-    cairo_pattern_add_color_stop_rgb(p, 0, 1, 1, 1);
-    cairo_pattern_add_color_stop_rgb(p, 1, 1, 0, 0);
+    cairo_pattern_t *p = cairo_pattern_create_linear (0, 0, 0, 100);
+
+    cairo_pattern_add_color_stop_rgb (p, 0, 1, 1, 1);
+    cairo_pattern_add_color_stop_rgb (p, 1, 1, 0, 0);
+
     cairo_matrix_t m;
-    cairo_matrix_init(&m, 100000, 0, 0, 100000, 0, 0);
-    cairo_pattern_set_matrix(p, &m);
-    cairo_set_source(cr, p);
-    cairo_rectangle(cr, 0, 0, 100, 100);
-    cairo_paint(cr);
-    cairo_pattern_destroy(p);
+    cairo_matrix_init (&m, 100000, 0, 0, 100000, 0, 0);
+    cairo_pattern_set_matrix (p, &m);
+
+    cairo_set_source (cr, p);
+    cairo_rectangle (cr, 0, 0, 100, 100);
+    cairo_paint (cr);
+
+    cairo_pattern_destroy (p);
+
     return CAIRO_TEST_SUCCESS;
 }
 
commit 3a06998b6ad9e5226854c1e90dcfe4a5bcf69052
Author: Koichi Akabe <vbkaisetsu at gmail.com>
Date:   Wed Feb 7 00:19:13 2024 +0900

    Destroy used pattern

diff --git a/test/gradient-scale-crash.c b/test/gradient-scale-crash.c
index bf005cd38..269b6a457 100644
--- a/test/gradient-scale-crash.c
+++ b/test/gradient-scale-crash.c
@@ -38,6 +38,7 @@ draw (cairo_t *cr, int width, int height)
     cairo_set_source(cr, p);
     cairo_rectangle(cr, 0, 0, 100, 100);
     cairo_paint(cr);
+    cairo_pattern_destroy(p);
     return CAIRO_TEST_SUCCESS;
 }
 
commit d517773ff145d06c5b9efb21841fbc95caf5f540
Author: Koichi Akabe <vbkaisetsu at gmail.com>
Date:   Tue Feb 6 22:18:06 2024 +0900

    Fix "out of memory" when using linear gradient

diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c
index fcaaf46b8..742c51b2e 100644
--- a/src/cairo-pattern.c
+++ b/src/cairo-pattern.c
@@ -2801,6 +2801,12 @@ _cairo_gradient_pattern_fit_to_range (const cairo_gradient_pattern_t *gradient,
 	dim = MAX (dim, fabs (radial->cd1.center.y - radial->cd2.center.y));
 	dim = MAX (dim, fabs (radial->cd1.radius   - radial->cd2.radius));
     }
+    dim = MAX (dim, fabs (gradient->base.matrix.xx));
+    dim = MAX (dim, fabs (gradient->base.matrix.xy));
+    dim = MAX (dim, fabs (gradient->base.matrix.x0));
+    dim = MAX (dim, fabs (gradient->base.matrix.yx));
+    dim = MAX (dim, fabs (gradient->base.matrix.yy));
+    dim = MAX (dim, fabs (gradient->base.matrix.y0));
 
     if (unlikely (dim > max_value)) {
 	cairo_matrix_t scale;
diff --git a/test/gradient-scale-crash.c b/test/gradient-scale-crash.c
new file mode 100644
index 000000000..bf005cd38
--- /dev/null
+++ b/test/gradient-scale-crash.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2024 Koichi Akabe
+ *
+ * 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: Koichi Akabe <vbkaisetsu at gmail.com>
+ */
+
+#include "cairo-test.h"
+
+static cairo_test_status_t
+draw (cairo_t *cr, int width, int height)
+{
+    cairo_pattern_t *p = cairo_pattern_create_linear(0, 0, 0, 100);
+    cairo_pattern_add_color_stop_rgb(p, 0, 1, 1, 1);
+    cairo_pattern_add_color_stop_rgb(p, 1, 1, 0, 0);
+    cairo_matrix_t m;
+    cairo_matrix_init(&m, 100000, 0, 0, 100000, 0, 0);
+    cairo_pattern_set_matrix(p, &m);
+    cairo_set_source(cr, p);
+    cairo_rectangle(cr, 0, 0, 100, 100);
+    cairo_paint(cr);
+    return CAIRO_TEST_SUCCESS;
+}
+
+CAIRO_TEST (gradient_scale_crash,
+	    "Exercises a bug found in scaling gradient pattern",
+	    "gradient, pattern", /* keywords */
+	    NULL, /* requirements */
+	    0, 0,
+	    NULL, draw)
diff --git a/test/meson.build b/test/meson.build
index d7834438f..dff2f2efe 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -160,6 +160,7 @@ test_sources = [
   'get-path-extents.c',
   'gradient-alpha.c',
   'gradient-constant-alpha.c',
+  'gradient-scale-crash.c',
   'gradient-zero-stops.c',
   'gradient-zero-stops-mask.c',
   'group-clip.c',


More information about the cairo-commit mailing list