From 90596b0964a1e102d07da7fad09fc1fb454910d3 Mon Sep 17 00:00:00 2001 From: Hans Petter Jansson Date: Wed, 1 Jun 2016 23:29:26 +0200 Subject: [PATCH] theme-node: Fix leak on stylesheet change. on_custom_stylesheet_changed() would set properties_computed to FALSE without freeing the old properties, then the properties pointer would be overwritten in ensure_properties(). https://bugzilla.gnome.org/show_bug.cgi?id=710230 --- src/st/st-theme-node.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/st/st-theme-node.c b/src/st/st-theme-node.c index 75df63774..5582c7589 100644 --- a/src/st/st-theme-node.c +++ b/src/st/st-theme-node.c @@ -66,11 +66,30 @@ st_theme_node_class_init (StThemeNodeClass *klass) object_class->finalize = st_theme_node_finalize; } +static void +maybe_free_properties (StThemeNode *node) +{ + if (node->properties) + { + g_free (node->properties); + node->properties = NULL; + node->n_properties = 0; + } + + if (node->inline_properties) + { + /* This destroys the list, not just the head of the list */ + cr_declaration_destroy (node->inline_properties); + node->inline_properties = NULL; + } +} + static void on_custom_stylesheets_changed (StTheme *theme, gpointer data) { StThemeNode *node = data; + maybe_free_properties (node); node->properties_computed = FALSE; } @@ -119,18 +138,7 @@ st_theme_node_finalize (GObject *object) g_strfreev (node->pseudo_classes); g_free (node->inline_style); - if (node->properties) - { - g_free (node->properties); - node->properties = NULL; - node->n_properties = 0; - } - - if (node->inline_properties) - { - /* This destroys the list, not just the head of the list */ - cr_declaration_destroy (node->inline_properties); - } + maybe_free_properties (node); if (node->font_desc) {