[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