diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2018-03-29 13:29:21 +0200 |
---|---|---|
committer | Philip Withnall <withnall@endlessm.com> | 2018-04-11 10:42:54 +0100 |
commit | fbbad525a5344a0c19f75470218f55b652143b5b (patch) | |
tree | 5e6b5a0b531193c5a39e12ebb8ceac51d9391f2c /gio/gsettings.c | |
parent | 64d281a1134bd0e4f5214c44a8483cf7a70d6cdd (diff) | |
download | glib-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.c | 22 |
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); |