[Xfce4-commits] [xfce/xfconf] 25/31: Fix a couple of memory leaks, due to g_variant conversion floating references.

noreply at xfce.org noreply at xfce.org
Thu Jun 1 13:33:18 CEST 2017


This is an automated email from the git hooks/post-receive script.

a   l   i       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository xfce/xfconf.

commit bae6bce6118b485f02d102de748cd2d9fe959ad9
Author: Ali Abdallah <aliovx at gmail.com>
Date:   Mon Apr 25 15:29:19 2016 +0200

    Fix a couple of memory leaks, due to g_variant conversion floating
    references.
---
 common/xfconf-gvaluefuncs.c | 21 +++++++++++++-----
 xfconf/xfconf-cache.c       | 53 +++++++++++++++++++++++++--------------------
 xfconfd/xfconf-daemon.c     | 18 +++++++++------
 3 files changed, 55 insertions(+), 37 deletions(-)

diff --git a/common/xfconf-gvaluefuncs.c b/common/xfconf-gvaluefuncs.c
index b801373..fd5059f 100644
--- a/common/xfconf-gvaluefuncs.c
+++ b/common/xfconf-gvaluefuncs.c
@@ -408,7 +408,7 @@ xfconf_basic_gvalue_to_gvariant (const GValue *value) {
     } 
     /* there is no g_variant_type_char! */
     else if (G_VALUE_TYPE(value) == G_TYPE_CHAR) {
-        return g_variant_new_int16(g_value_get_schar(value));
+        return g_variant_ref_sink(g_variant_new_int16(g_value_get_schar(value)));
     }
         
     g_warning ("Unable to convert GType '%s' to GVariant", _xfconf_string_from_gtype(G_VALUE_TYPE(value)));
@@ -484,17 +484,19 @@ xfconf_gvalue_to_gvariant (const GValue *value)
             GVariant *var = NULL;
             
             var = xfconf_basic_gvalue_to_gvariant (v);
-            if (var)
+            if (var) {
                 g_variant_builder_add (&builder, "v", var, NULL);
+                g_variant_unref (var);
+            }
         }
         
-        variant = g_variant_builder_end (&builder);
+        variant = g_variant_ref_sink(g_variant_builder_end (&builder));
     }
     else if (G_VALUE_TYPE(value) == G_TYPE_STRV) {
         gchar **strlist;
         
         strlist = g_value_get_boxed(value);
-        variant = g_variant_new_strv ((const gchar**)strlist, g_strv_length(strlist));
+        variant = g_variant_ref_sink(g_variant_new_strv ((const gchar**)strlist, g_strv_length(strlist)));
     }
     else
         variant = xfconf_basic_gvalue_to_gvariant(value);
@@ -532,7 +534,10 @@ GVariant *xfconf_hash_to_gvariant (GHashTable *hash)
                 if(item_value)
                 {
                     v = xfconf_basic_gvalue_to_gvariant(item_value);
-                    g_variant_builder_add (&arr_builder, "v", v);
+                    if (v) {
+                        g_variant_builder_add (&arr_builder, "v", v);
+                        g_variant_unref (v);
+                    }
                 }
             }
             
@@ -544,11 +549,15 @@ GVariant *xfconf_hash_to_gvariant (GHashTable *hash)
             
             strlist = g_value_get_boxed(value);
             variant = g_variant_new_strv ((const gchar**)strlist, g_strv_length(strlist));
+            g_variant_builder_add (&builder, "{sv}", key, variant);
         }
         else {
             
             v = xfconf_basic_gvalue_to_gvariant(value);
-            g_variant_builder_add (&builder, "{sv}", key, v);
+            if (v) {
+                g_variant_builder_add (&builder, "{sv}", key, v);
+                g_variant_unref (v);
+            }
         }
     }
     
diff --git a/xfconf/xfconf-cache.c b/xfconf/xfconf-cache.c
index 65dba64..491b99a 100644
--- a/xfconf/xfconf-cache.c
+++ b/xfconf/xfconf-cache.c
@@ -754,7 +754,7 @@ xfconf_cache_set(XfconfCache *cache,
                  const GValue *value,
                  GError **error)
 {
-    GVariant *variant = NULL;
+    GVariant *variant = NULL, *val = NULL;
     GDBusProxy *proxy = _xfconf_get_gdbus_proxy();
     XfconfCacheItem *item = NULL;
     XfconfCacheOldItem *old_item = NULL;
@@ -820,31 +820,36 @@ xfconf_cache_set(XfconfCache *cache,
         g_hash_table_insert(cache->old_properties, old_item->property, old_item);
     }
 
-    variant = g_variant_new_variant (xfconf_gvalue_to_gvariant (value));
-
-    xfconf_exported_call_set_property ((XfconfExported *)proxy, 
-                                     cache->channel_name,
-                                     property,
-                                     variant,
-                                     old_item->cancellable,
-                                     (GAsyncReadyCallback) xfconf_cache_set_property_reply_handler,
-                                     old_item);
-
-    g_hash_table_insert(cache->pending_calls, old_item->cancellable, old_item);
+    val = xfconf_gvalue_to_gvariant (value);
+    if (val) {
+        variant = g_variant_new_variant (val);
+
+        xfconf_exported_call_set_property ((XfconfExported *)proxy, 
+                                           cache->channel_name,
+                                           property,
+                                           variant,
+                                           old_item->cancellable,
+                                           (GAsyncReadyCallback) xfconf_cache_set_property_reply_handler,
+                                           old_item);
+        
+        g_hash_table_insert(cache->pending_calls, old_item->cancellable, old_item);
+        
+        if(item)
+            xfconf_cache_item_update(item, value);
+        else {
+            item = xfconf_cache_item_new(value, FALSE);
+            g_tree_insert(cache->properties, g_strdup(property), item);
+        }
+        
+        xfconf_cache_mutex_unlock(cache);
 
-    if(item)
-        xfconf_cache_item_update(item, value);
-    else {
-        item = xfconf_cache_item_new(value, FALSE);
-        g_tree_insert(cache->properties, g_strdup(property), item);
+        g_signal_emit(G_OBJECT(cache), signals[SIG_PROPERTY_CHANGED], 0,
+                      cache->channel_name, property, value);
+        
+        g_variant_unref (val);
+        return TRUE;
     }
-
-    xfconf_cache_mutex_unlock(cache);
-
-    g_signal_emit(G_OBJECT(cache), signals[SIG_PROPERTY_CHANGED], 0,
-                  cache->channel_name, property, value);
-
-    return TRUE;
+    return FALSE;
 }
 
 typedef struct
diff --git a/xfconfd/xfconf-daemon.c b/xfconfd/xfconf-daemon.c
index 6197ae9..a729519 100644
--- a/xfconfd/xfconf-daemon.c
+++ b/xfconfd/xfconf-daemon.c
@@ -103,11 +103,13 @@ xfconf_daemon_emit_property_changed_idled(gpointer data)
     xfconf_backend_get(pdata->backend, pdata->channel, pdata->property,
                        &value, NULL);
     if(G_VALUE_TYPE(&value)) {
-        GVariant *v;
-        v = g_variant_new_variant (xfconf_gvalue_to_gvariant (&value));
-        if (v) {
+        GVariant *val, *variant;
+        val = xfconf_gvalue_to_gvariant (&value);
+        if (val) {
+            variant = g_variant_new_variant (val);
             xfconf_exported_emit_property_changed ((XfconfExported*)pdata->xfconfd,
-                                                   pdata->channel, pdata->property, v);
+                                                   pdata->channel, pdata->property, variant);
+            g_variant_unref (val);
         }
         g_value_unset(&value);
     } else {
@@ -207,10 +209,12 @@ xfconf_get_property(XfconfExported *skeleton,
     /* check each backend until we find a value */
     for(l = xfconfd->backends; l; l = l->next) {
         if(xfconf_backend_get(l->data, channel, property, &value, &error)) {
-            GVariant *variant;
-            variant = g_variant_new_variant(xfconf_gvalue_to_gvariant (&value));
-            if (variant){
+            GVariant *variant, *val;
+            val = xfconf_gvalue_to_gvariant (&value);
+            if (val){
+                variant = g_variant_new_variant (val);
                 xfconf_exported_complete_get_property(skeleton, invocation, variant);
+                g_variant_unref (val);
             }
             else {
                 g_set_error (&error, XFCONF_ERROR, 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list