summaryrefslogtreecommitdiff
path: root/gio/gsettings.c
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2018-03-29 13:29:21 +0200
committerPhilip Withnall <withnall@endlessm.com>2018-04-11 10:42:54 +0100
commitfbbad525a5344a0c19f75470218f55b652143b5b (patch)
tree5e6b5a0b531193c5a39e12ebb8ceac51d9391f2c /gio/gsettings.c
parent64d281a1134bd0e4f5214c44a8483cf7a70d6cdd (diff)
downloadglib-fbbad525a5344a0c19f75470218f55b652143b5b.tar.gz
gsettings: Fix leaks and assertion on range binding failures
When using g_settings_bind(), if a range binding triggers a range check failure, g_settings_binding_property_changed() will return early, but it won't cleanup properly causing some leaks. The binding will also still be marked as 'running', which causes an assertion failure when trying to free it: "g_settings_binding_free: assertion failed: (!binding->running)" Signed-off-by: Christophe Fergeau <cfergeau@redhat.com> https://bugzilla.gnome.org/show_bug.cgi?id=794805
Diffstat (limited to 'gio/gsettings.c')
-rw-r--r--gio/gsettings.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/gio/gsettings.c b/gio/gsettings.c
index f05471c61..87b38bcbb 100644
--- a/gio/gsettings.c
+++ b/gio/gsettings.c
@@ -2682,6 +2682,7 @@ g_settings_binding_property_changed (GObject *object,
GSettingsBinding *binding = user_data;
GValue value = G_VALUE_INIT;
GVariant *variant;
+ gboolean valid = TRUE;
g_assert (object == binding->object);
g_assert (pspec == binding->property);
@@ -2700,24 +2701,33 @@ g_settings_binding_property_changed (GObject *object,
if (!g_settings_schema_key_type_check (&binding->key, variant))
{
+ gchar *type_str;
+ type_str = g_variant_type_dup_string (binding->key.type);
g_critical ("binding mapping function for key '%s' returned "
"GVariant of type '%s' when type '%s' was requested",
binding->key.name, g_variant_get_type_string (variant),
- g_variant_type_dup_string (binding->key.type));
- return;
+ type_str);
+ g_free (type_str);
+ valid = FALSE;
}
- if (!g_settings_schema_key_range_check (&binding->key, variant))
+ if (valid && !g_settings_schema_key_range_check (&binding->key, variant))
{
+ gchar *variant_str;
+ variant_str = g_variant_print (variant, TRUE);
g_critical ("GObject property '%s' on a '%s' object is out of "
"schema-specified range for key '%s' of '%s': %s",
binding->property->name, g_type_name (binding->property->owner_type),
binding->key.name, g_settings_schema_get_id (binding->key.schema),
- g_variant_print (variant, TRUE));
- return;
+ variant_str);
+ g_free (variant_str);
+ valid = FALSE;
}
- g_settings_write_to_backend (binding->settings, &binding->key, variant);
+ if (valid)
+ {
+ g_settings_write_to_backend (binding->settings, &binding->key, variant);
+ }
g_variant_unref (variant);
}
g_value_unset (&value);