GSettings: be more careful about keys names with /
authorRyan Lortie <desrt@desrt.ca>
Fri, 6 Jul 2012 17:43:17 +0000 (13:43 -0400)
committerRyan Lortie <desrt@desrt.ca>
Fri, 6 Jul 2012 17:44:17 +0000 (13:44 -0400)
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
gio/gsettingsschema.c

index 219630b..a6ee776 100644 (file)
@@ -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;
 }
index bdb9bab..f8be19f 100644 (file)
@@ -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);