cssimportrule: Add recursion check

This commit is contained in:
Benjamin Otte
2016-03-26 06:24:37 +01:00
parent 9d07be0238
commit 9c12d01ba3

View File

@@ -68,6 +68,25 @@ gtk_css_import_rule_new (GtkCssRule *parent_rule,
NULL);
}
static gboolean
gtk_css_import_rule_would_recurse (GtkCssImportRule *rule)
{
GtkCssImportRulePrivate *priv = gtk_css_import_rule_get_instance_private (GTK_CSS_IMPORT_RULE (rule));
GtkCssStyleSheet *sheet;
for (sheet = gtk_css_rule_get_parent_style_sheet (GTK_CSS_RULE (rule));
sheet != NULL;
sheet = gtk_css_style_sheet_get_parent_style_sheet (sheet))
{
GFile *sheet_file = gtk_css_style_sheet_get_file (sheet);
if (sheet_file && g_file_equal (sheet_file, priv->file))
return TRUE;
}
return FALSE;
}
GtkCssRule *
gtk_css_import_rule_new_parse (GtkCssTokenSource *source,
GtkCssRule *parent_rule,
@@ -126,9 +145,19 @@ gtk_css_import_rule_new_parse (GtkCssTokenSource *source,
return NULL;
}
if (g_file_load_contents (priv->file, NULL,
&data, &size,
NULL, &load_error))
if (gtk_css_import_rule_would_recurse (GTK_CSS_IMPORT_RULE (result)))
{
char *path = g_file_get_path (priv->file);
gtk_css_token_source_error (source,
"Loading '%s' would recurse",
path);
g_object_unref (result);
g_free (path);
bytes = g_bytes_new (NULL, 0);
}
else if (g_file_load_contents (priv->file, NULL,
&data, &size,
NULL, &load_error))
{
bytes = g_bytes_new_take (data, size);
}