From: Benjamin Otte Date: Sun, 2 Jul 2023 04:28:29 +0000 (+0200) Subject: gsk: Catch values < 0 before bad things happen X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~77^2~5 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c79ec355af8aa93220736ff56fd65c1e3b4b60b5;p=gtk4.git gsk: Catch values < 0 before bad things happen In particular, catch radius values being < 0 by return_if_fail()ing in the rendernode creation code, and by erroring out in the rendernode parser. I try too much dumb stuff in the node editor. --- diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index e2ccd3c336..a1ef5de8fe 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -2421,6 +2421,7 @@ gsk_inset_shadow_node_new (const GskRoundedRect *outline, g_return_val_if_fail (outline != NULL, NULL); g_return_val_if_fail (color != NULL, NULL); + g_return_val_if_fail (blur_radius >= 0, NULL); self = gsk_render_node_alloc (GSK_INSET_SHADOW_NODE); node = (GskRenderNode *) self; @@ -2696,7 +2697,7 @@ gsk_outset_shadow_node_diff (GskRenderNode *node1, static void gsk_outset_shadow_node_class_init (gpointer g_class, - gpointer class_data) + gpointer class_data) { GskRenderNodeClass *node_class = g_class; @@ -2734,6 +2735,7 @@ gsk_outset_shadow_node_new (const GskRoundedRect *outline, g_return_val_if_fail (outline != NULL, NULL); g_return_val_if_fail (color != NULL, NULL); + g_return_val_if_fail (blur_radius >= 0, NULL); self = gsk_render_node_alloc (GSK_OUTSET_SHADOW_NODE); node = (GskRenderNode *) self; diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index ea54470c8c..923cddf3db 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -453,6 +453,21 @@ parse_double (GtkCssParser *parser, return gtk_css_parser_consume_number (parser, out_double); } +static gboolean +parse_positive_double (GtkCssParser *parser, + Context *context, + gpointer out_double) +{ + if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNED_NUMBER) + || gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNED_INTEGER)) + { + gtk_css_parser_error_syntax (parser, "Expected a positive number"); + return FALSE; + } + + return gtk_css_parser_consume_number (parser, out_double); +} + static gboolean parse_point (GtkCssParser *parser, Context *context, @@ -1242,10 +1257,10 @@ parse_radial_gradient_node_internal (GtkCssParser *parser, const Declaration declarations[] = { { "bounds", parse_rect, NULL, &bounds }, { "center", parse_point, NULL, ¢er }, - { "hradius", parse_double, NULL, &hradius }, - { "vradius", parse_double, NULL, &vradius }, - { "start", parse_double, NULL, &start }, - { "end", parse_double, NULL, &end }, + { "hradius", parse_positive_double, NULL, &hradius }, + { "vradius", parse_positive_double, NULL, &vradius }, + { "start", parse_positive_double, NULL, &start }, + { "end", parse_positive_double, NULL, &end }, { "stops", parse_stops, clear_stops, &stops }, }; GskRenderNode *result; @@ -1335,7 +1350,7 @@ parse_inset_shadow_node (GtkCssParser *parser, { "dx", parse_double, NULL, &dx }, { "dy", parse_double, NULL, &dy }, { "spread", parse_double, NULL, &spread }, - { "blur", parse_double, NULL, &blur } + { "blur", parse_positive_double, NULL, &blur } }; parse_declarations (parser, context, declarations, G_N_ELEMENTS (declarations)); @@ -1737,7 +1752,7 @@ parse_outset_shadow_node (GtkCssParser *parser, { "dx", parse_double, NULL, &dx }, { "dy", parse_double, NULL, &dy }, { "spread", parse_double, NULL, &spread }, - { "blur", parse_double, NULL, &blur } + { "blur", parse_positive_double, NULL, &blur } }; parse_declarations (parser, context, declarations, G_N_ELEMENTS (declarations)); @@ -2017,7 +2032,7 @@ parse_blur_node (GtkCssParser *parser, GskRenderNode *child = NULL; double blur_radius = 1.0; const Declaration declarations[] = { - { "blur", parse_double, NULL, &blur_radius }, + { "blur", parse_positive_double, NULL, &blur_radius }, { "child", parse_node, clear_node, &child }, }; GskRenderNode *result;