[glib] GSettings: be more careful about keys names with /



commit ed492a5de2a217c08bccd4032b1122fba2f25c6f
Author: Ryan Lortie <desrt desrt ca>
Date:   Fri Jul 6 13:43:17 2012 -0400

    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 219630b..a6ee776 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 bdb9bab..f8be19f 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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]