summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS7
-rw-r--r--configure.ac2
-rw-r--r--gio/glib-compile-schemas.c92
-rw-r--r--gio/gsettings.c19
-rw-r--r--gio/tests/gsettings.c5
-rw-r--r--win32/Makefile.am2
6 files changed, 87 insertions, 40 deletions
diff --git a/NEWS b/NEWS
index afe6a56ed..9e1bc2d19 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,10 @@
+Overview of changes in GLib 2.51.4
+==================================
+
+* Memory leak fixes
+* Fix the released tarball
+
+
Overview of changes in GLib 2.51.3
==================================
diff --git a/configure.ac b/configure.ac
index 954d86e9e..324388f51 100644
--- a/configure.ac
+++ b/configure.ac
@@ -31,7 +31,7 @@ m4_define(glib_configure_ac)
m4_define([glib_major_version], [2])
m4_define([glib_minor_version], [51])
-m4_define([glib_micro_version], [3])
+m4_define([glib_micro_version], [4])
m4_define([glib_interface_age], [0])
m4_define([glib_binary_age],
[m4_eval(100 * glib_minor_version + glib_micro_version)])
diff --git a/gio/glib-compile-schemas.c b/gio/glib-compile-schemas.c
index 833ae6bb0..e190ff5af 100644
--- a/gio/glib-compile-schemas.c
+++ b/gio/glib-compile-schemas.c
@@ -879,6 +879,7 @@ schema_state_free (gpointer data)
g_free (state->path);
g_free (state->gettext_domain);
g_hash_table_unref (state->keys);
+ g_slice_free (SchemaState, state);
}
static void
@@ -1621,6 +1622,12 @@ gvdb_pair_init (GvdbPair *pair)
pair->root = gvdb_hash_table_insert (pair->table, "");
}
+static void
+gvdb_pair_clear (GvdbPair *pair)
+{
+ g_hash_table_unref (pair->table);
+}
+
typedef struct
{
GHashTable *schema_table;
@@ -1643,6 +1650,7 @@ output_key (gpointer key,
const gchar *name;
KeyState *state;
GvdbItem *item;
+ GVariant *serialised = NULL;
name = key;
state = value;
@@ -1650,7 +1658,9 @@ output_key (gpointer key,
item = gvdb_hash_table_insert (data->pair.table, name);
gvdb_item_set_parent (item, data->pair.root);
- gvdb_item_set_value (item, key_state_serialise (state));
+ serialised = key_state_serialise (state);
+ gvdb_item_set_value (item, serialised);
+ g_variant_unref (serialised);
if (state->l10n)
data->l10n = TRUE;
@@ -1702,6 +1712,8 @@ output_schema (gpointer key,
gvdb_hash_table_insert_string (data.pair.table,
".gettext-domain",
state->gettext_domain);
+
+ gvdb_pair_clear (&data.pair);
}
static gboolean
@@ -1796,6 +1808,8 @@ parse_gschema_files (gchar **files,
g_hash_table_unref (state.flags_table);
g_hash_table_unref (state.enum_table);
+ g_free (contents);
+
return NULL;
}
else
@@ -1803,6 +1817,7 @@ parse_gschema_files (gchar **files,
}
/* cleanup */
+ g_free (contents);
g_markup_parse_context_free (context);
g_slist_free (state.this_file_schemas);
g_slist_free (state.this_file_flagss);
@@ -2020,19 +2035,20 @@ set_overrides (GHashTable *schema_table,
int
main (int argc, char **argv)
{
- GError *error;
- GHashTable *table;
- GDir *dir;
+ GError *error = NULL;
+ GHashTable *table = NULL;
+ GDir *dir = NULL;
const gchar *file;
- gchar *srcdir;
+ const gchar *srcdir;
gboolean show_version_and_exit = FALSE;
gchar *targetdir = NULL;
- gchar *target;
+ gchar *target = NULL;
gboolean dry_run = FALSE;
gboolean strict = FALSE;
gchar **schema_files = NULL;
gchar **override_files = NULL;
- GOptionContext *context;
+ GOptionContext *context = NULL;
+ gint retval;
GOptionEntry entries[] = {
{ "version", 0, 0, G_OPTION_ARG_NONE, &show_version_and_exit, N_("Show program version and exit"), NULL },
{ "targetdir", 0, 0, G_OPTION_ARG_FILENAME, &targetdir, N_("where to store the gschemas.compiled file"), N_("DIRECTORY") },
@@ -2046,7 +2062,7 @@ main (int argc, char **argv)
};
#ifdef G_OS_WIN32
- gchar *tmp;
+ gchar *tmp = NULL;
#endif
setlocale (LC_ALL, "");
@@ -2055,7 +2071,6 @@ main (int argc, char **argv)
#ifdef G_OS_WIN32
tmp = _glib_get_locale_dir ();
bindtextdomain (GETTEXT_PACKAGE, tmp);
- g_free (tmp);
#else
bindtextdomain (GETTEXT_PACKAGE, GLIB_LOCALE_DIR);
#endif
@@ -2072,33 +2087,30 @@ main (int argc, char **argv)
"and the cache file is called gschemas.compiled."));
g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
- error = NULL;
if (!g_option_context_parse (context, &argc, &argv, &error))
{
fprintf (stderr, "%s\n", error->message);
- return 1;
+ retval = 1;
+ goto done;
}
- g_option_context_free (context);
-
if (show_version_and_exit)
{
g_print (PACKAGE_VERSION "\n");
- return 0;
+ retval = 0;
+ goto done;
}
if (!schema_files && argc != 2)
{
fprintf (stderr, _("You should give exactly one directory name\n"));
- return 1;
+ retval = 1;
+ goto done;
}
srcdir = argv[1];
- if (targetdir == NULL)
- targetdir = srcdir;
-
- target = g_build_filename (targetdir, "gschemas.compiled", NULL);
+ target = g_build_filename (targetdir ? targetdir : srcdir, "gschemas.compiled", NULL);
if (!schema_files)
{
@@ -2112,7 +2124,12 @@ main (int argc, char **argv)
if (dir == NULL)
{
fprintf (stderr, "%s\n", error->message);
- return 1;
+
+ g_ptr_array_unref (files);
+ g_ptr_array_unref (overrides);
+
+ retval = 1;
+ goto done;
}
while ((file = g_dir_read_name (dir)) != NULL)
@@ -2136,7 +2153,11 @@ main (int argc, char **argv)
else
fprintf (stdout, _("removed existing output file.\n"));
- return 0;
+ g_ptr_array_unref (files);
+ g_ptr_array_unref (overrides);
+
+ retval = 0;
+ goto done;
}
g_ptr_array_sort (files, compare_strings);
g_ptr_array_add (files, NULL);
@@ -2150,27 +2171,42 @@ main (int argc, char **argv)
if ((table = parse_gschema_files (schema_files, strict)) == NULL)
{
- g_free (target);
- return 1;
+ retval = 1;
+ goto done;
}
if (override_files != NULL &&
!set_overrides (table, override_files, strict))
{
- g_free (target);
- return 1;
+ retval = 1;
+ goto done;
}
if (!dry_run && !write_to_file (table, target, &error))
{
fprintf (stderr, "%s\n", error->message);
- g_free (target);
- return 1;
+ retval = 1;
+ goto done;
}
+ /* Success. */
+ retval = 0;
+
+done:
+ g_clear_error (&error);
+ g_clear_pointer (&table, g_hash_table_unref);
+ g_clear_pointer (&dir, g_dir_close);
+ g_free (targetdir);
g_free (target);
+ g_strfreev (schema_files);
+ g_strfreev (override_files);
+ g_option_context_free (context);
+
+#ifdef G_OS_WIN32
+ g_free (tmp);
+#endif
- return 0;
+ return retval;
}
/* Epilogue {{{1 */
diff --git a/gio/gsettings.c b/gio/gsettings.c
index 2b974e90c..66c6f9bde 100644
--- a/gio/gsettings.c
+++ b/gio/gsettings.c
@@ -1571,6 +1571,7 @@ g_settings_set_value (GSettings *settings,
g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE);
g_return_val_if_fail (key != NULL, FALSE);
+ g_variant_ref_sink (value);
g_settings_schema_key_init (&skey, settings->priv->schema, key);
if (!g_settings_schema_key_type_check (&skey, value))
@@ -1580,22 +1581,23 @@ g_settings_set_value (GSettings *settings,
g_settings_schema_get_id (settings->priv->schema),
g_variant_type_peek_string (skey.type),
g_variant_get_type_string (value));
-
- return FALSE;
- }
-
- if (!g_settings_schema_key_range_check (&skey, value))
+ success = FALSE;
+ }
+ else if (!g_settings_schema_key_range_check (&skey, value))
{
g_warning ("g_settings_set_value: value for key '%s' in schema '%s' "
"is outside of valid range",
key,
g_settings_schema_get_id (settings->priv->schema));
-
- return FALSE;
+ success = FALSE;
+ }
+ else
+ {
+ success = g_settings_write_to_backend (settings, &skey, value);
}
- success = g_settings_write_to_backend (settings, &skey, value);
g_settings_schema_key_clear (&skey);
+ g_variant_unref (value);
return success;
}
@@ -3271,6 +3273,7 @@ g_settings_action_finalize (GObject *object)
g_signal_handlers_disconnect_by_data (gsa->settings, gsa);
g_object_unref (gsa->settings);
+ g_settings_schema_key_clear (&gsa->key);
G_OBJECT_CLASS (g_settings_action_parent_class)
->finalize (object);
diff --git a/gio/tests/gsettings.c b/gio/tests/gsettings.c
index 18d28c25d..b1bbd4ed1 100644
--- a/gio/tests/gsettings.c
+++ b/gio/tests/gsettings.c
@@ -2373,10 +2373,8 @@ test_schema_list_keys (void)
"farewell",
NULL));
-
g_strfreev (keys);
g_settings_schema_unref (schema);
- g_settings_schema_source_unref (src);
}
static void
@@ -2440,6 +2438,8 @@ test_actions (void)
g_assert_cmpstr (g_variant_get_string (state, NULL), ==, "kthxbye");
g_free (name);
+ g_variant_type_free (param_type);
+ g_variant_type_free (state_type);
g_variant_unref (state);
g_object_unref (string);
@@ -2629,6 +2629,7 @@ main (int argc, char *argv[])
g_assert (g_file_get_contents (SRCDIR "/org.gtk.test.gschema.xml.orig", &schema_text, NULL, NULL));
g_assert (g_file_set_contents ("org.gtk.test.gschema.xml", schema_text, -1, NULL));
+ g_free (schema_text);
g_remove ("gschemas.compiled");
g_assert (g_spawn_command_line_sync ("../glib-compile-schemas --targetdir=. "
diff --git a/win32/Makefile.am b/win32/Makefile.am
index 44a6345ff..3a08bd59b 100644
--- a/win32/Makefile.am
+++ b/win32/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = vs9 vs10 vs11 vs12 vs14
+SUBDIRS = vs9 vs10 vs11 vs12 vs14 vs15
EXTRA_DIST = \
glibpc.py \