gsk: Catch values < 0 before bad things happen
authorBenjamin Otte <otte@redhat.com>
Sun, 2 Jul 2023 04:28:29 +0000 (06:28 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 3 Jul 2023 20:02:44 +0000 (22:02 +0200)
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.

gsk/gskrendernodeimpl.c
gsk/gskrendernodeparser.c

index e2ccd3c336f9e347102e686622891bd0b320be33..a1ef5de8fe9227854d4c4b70737d70bc137d84ea 100644 (file)
@@ -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;
index ea54470c8cdea3ee1fccea00fd8b00fa25c52241..923cddf3db7520572dc3fb3cc70f585edab8ae79 100644 (file)
@@ -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, &center },
-    { "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;