g_settings_schema_list: some fixes

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
This commit is contained in:
Ryan Lortie 2013-10-28 09:29:15 -07:00
parent 5616e03f7a
commit 066df98849

View File

@ -1012,11 +1012,14 @@ g_settings_schema_list (GSettingsSchema *schema,
list = gvdb_table_list (s->table, "");
if (list)
{
for (i = 0; list[i]; i++)
g_hash_table_add (items, list[i]); /* transfer ownership */
g_free (list); /* free container only */
}
}
/* Do a first pass to eliminate child items that do not map to
* valid schemas (ie: ones that would crash us if we actually
@ -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->n_items = i;
g_assert (i == len);