summaryrefslogtreecommitdiff
path: root/gtk/gtkcsscolorvalue.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2013-03-28 23:13:43 +0100
committerBenjamin Otte <otte@redhat.com>2013-03-28 23:18:59 +0100
commitcbee3901486781370f50ee02f49bdbd463f3eaa3 (patch)
tree1fa0753468338560bed086dcfd77b69535c22ca8 /gtk/gtkcsscolorvalue.c
parentc25d8e3aea900f8ae2abd2907a5b8a2e89e7ee9e (diff)
downloadgtk+-cbee3901486781370f50ee02f49bdbd463f3eaa3.tar.gz
cssvalue: At cycle detection to color resolving
The following CSS would infloop: @define-color self @self as it would infinitely lookup the color named "self" and try to resolve it. This patch adds detection of such cycles to the resolve function by keeping a list of currently resolving colors in the cycle_list variable.
Diffstat (limited to 'gtk/gtkcsscolorvalue.c')
-rw-r--r--gtk/gtkcsscolorvalue.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/gtk/gtkcsscolorvalue.c b/gtk/gtkcsscolorvalue.c
index 64933bde58..d523fe82d4 100644
--- a/gtk/gtkcsscolorvalue.c
+++ b/gtk/gtkcsscolorvalue.c
@@ -140,7 +140,8 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
GtkStyleProviderPrivate *provider,
GtkCssValue *current,
GtkCssDependencies current_deps,
- GtkCssDependencies *dependencies)
+ GtkCssDependencies *dependencies,
+ GSList *cycle_list)
{
GtkCssDependencies unused;
GtkCssValue *value;
@@ -160,12 +161,18 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
case COLOR_TYPE_NAME:
{
GtkCssValue *named;
+ GSList cycle = { color, cycle_list };
+
+ /* If color exists in cycle_list, we're currently resolving it.
+ * So we've detected a cycle. */
+ if (g_slist_find (cycle_list, color))
+ return NULL;
named = _gtk_style_provider_private_get_color (provider, color->sym_col.name);
if (named == NULL)
return NULL;
- value = _gtk_css_color_value_resolve (named, provider, current, current_deps, dependencies);
+ value = _gtk_css_color_value_resolve (named, provider, current, current_deps, dependencies, &cycle);
if (value == NULL)
return NULL;
}
@@ -177,7 +184,7 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
GtkHSLA hsla;
GdkRGBA shade;
- val = _gtk_css_color_value_resolve (color->sym_col.shade.color, provider, current, current_deps, dependencies);
+ val = _gtk_css_color_value_resolve (color->sym_col.shade.color, provider, current, current_deps, dependencies, cycle_list);
if (val == NULL)
return NULL;
@@ -199,7 +206,7 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
GtkCssValue *val;
GdkRGBA alpha;
- val = _gtk_css_color_value_resolve (color->sym_col.alpha.color, provider, current, current_deps, dependencies);
+ val = _gtk_css_color_value_resolve (color->sym_col.alpha.color, provider, current, current_deps, dependencies, cycle_list);
if (val == NULL)
return NULL;
@@ -219,13 +226,13 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
GdkRGBA color1, color2, res;
GtkCssDependencies dep1, dep2;
- val = _gtk_css_color_value_resolve (color->sym_col.mix.color1, provider, current, current_deps, &dep1);
+ val = _gtk_css_color_value_resolve (color->sym_col.mix.color1, provider, current, current_deps, &dep1, cycle_list);
if (val == NULL)
return NULL;
color1 = *_gtk_css_rgba_value_get_rgba (val);
_gtk_css_value_unref (val);
- val = _gtk_css_color_value_resolve (color->sym_col.mix.color2, provider, current, current_deps, &dep2);
+ val = _gtk_css_color_value_resolve (color->sym_col.mix.color2, provider, current, current_deps, &dep2, cycle_list);
if (val == NULL)
return NULL;
color2 = *_gtk_css_rgba_value_get_rgba (val);
@@ -324,7 +331,8 @@ gtk_css_value_color_compute (GtkCssValue *value,
provider,
current,
current_deps,
- dependencies);
+ dependencies,
+ NULL);
if (resolved == NULL)
return gtk_css_value_color_get_fallback (property_id, provider, values, parent_values);