From ed492a5de2a217c08bccd4032b1122fba2f25c6f Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Fri, 6 Jul 2012 13:43:17 -0400 Subject: [PATCH] GSettings: be more careful about keys names with / Prevent attempts to access keys ending with slashes that exist in the schema file as references to child schemas. Also: don't emit change signals for these same keys. --- gio/gsettings.c | 20 ++++++++++++++++---- gio/gsettingsschema.c | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/gio/gsettings.c b/gio/gsettings.c index 219630b79..a6ee776c2 100644 --- a/gio/gsettings.c +++ b/gio/gsettings.c @@ -279,8 +279,14 @@ g_settings_real_change_event (GSettings *settings, keys = g_settings_schema_list (settings->priv->schema, &n_keys); for (i = 0; i < n_keys; i++) - g_signal_emit (settings, g_settings_signals[SIGNAL_CHANGED], - keys[i], g_quark_to_string (keys[i])); + { + const gchar *key = g_quark_to_string (keys[i]); + + if (g_str_has_suffix (key, "/")) + continue; + + g_signal_emit (settings, g_settings_signals[SIGNAL_CHANGED], keys[i], key); + } return FALSE; } @@ -297,8 +303,14 @@ g_settings_real_writable_change_event (GSettings *settings, keys = g_settings_schema_list (settings->priv->schema, &n_keys); for (i = 0; i < n_keys; i++) - g_signal_emit (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGED], - keys[i], g_quark_to_string (keys[i])); + { + const gchar *key = g_quark_to_string (keys[i]); + + if (g_str_has_suffix (key, "/")) + continue; + + g_signal_emit (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGED], keys[i], key); + } return FALSE; } diff --git a/gio/gsettingsschema.c b/gio/gsettingsschema.c index bdb9babcb..f8be19fa9 100644 --- a/gio/gsettingsschema.c +++ b/gio/gsettingsschema.c @@ -636,7 +636,7 @@ g_settings_schema_get_value (GSettingsSchema *schema, value = gvdb_table_get_raw_value (schema->table, key); - if G_UNLIKELY (value == NULL) + if G_UNLIKELY (value == NULL || !g_variant_is_of_type (value, G_VARIANT_TYPE_TUPLE)) g_error ("Settings schema '%s' does not contain a key named '%s'", schema->id, key); iter = g_variant_iter_new (value);