g_settings_schema_list: some fixes
authorRyan Lortie <desrt@desrt.ca>
Mon, 28 Oct 2013 16:29:15 +0000 (09:29 -0700)
committerRyan Lortie <desrt@desrt.ca>
Mon, 28 Oct 2013 16:44:05 +0000 (09:44 -0700)
Prevent a crash in the case that gvdb_table_list() returns NULL (ie:
because a schema has no keys).

Stop a memory leak caused by pointlessly stealing keys from a hashtable
(after we quarked them already).

Stop allocating an extra entry at the end of an array for a terminator
(that we never wrote anyway) when all functions using this API refer to
the out-parameter length array.

https://bugzilla.gnome.org/show_bug.cgi?id=711016

gio/gsettingsschema.c

index b79d91a..fa9f9da 100644 (file)
@@ -1012,10 +1012,13 @@ g_settings_schema_list (GSettingsSchema *schema,
 
           list = gvdb_table_list (s->table, "");
 
-          for (i = 0; list[i]; i++)
-            g_hash_table_add (items, list[i]); /* transfer ownership */
+          if (list)
+            {
+              for (i = 0; list[i]; i++)
+                g_hash_table_add (items, list[i]); /* transfer ownership */
 
-          g_free (list); /* free container only */
+              g_free (list); /* free container only */
+            }
         }
 
       /* Do a first pass to eliminate child items that do not map to
@@ -1076,15 +1079,12 @@ g_settings_schema_list (GSettingsSchema *schema,
 
       /* Now create the list */
       len = g_hash_table_size (items);
-      schema->items = g_new (GQuark, len + 1);
+      schema->items = g_new (GQuark, len);
       i = 0;
       g_hash_table_iter_init (&iter, items);
 
       while (g_hash_table_iter_next (&iter, &name, NULL))
-        {
-          schema->items[i++] = g_quark_from_string (name);
-          g_hash_table_iter_steal (&iter);
-        }
+        schema->items[i++] = g_quark_from_string (name);
       schema->n_items = i;
       g_assert (i == len);