summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@coaxion.net>2021-03-23 16:52:15 +0000
committerSebastian Dröge <slomo@coaxion.net>2021-03-23 16:52:15 +0000
commit8406a2b742fdda33dd2ecee12f6545e6fe7908a4 (patch)
treeb56102eb51d8b27451ece47dd18c2045f2ffabb9
parent9bad38887d1bf8c0d67babba8eae6cefe6619cc9 (diff)
parent34e48418546e2a76c991d9780418401437a1af7a (diff)
downloadglib-8406a2b742fdda33dd2ecee12f6545e6fe7908a4.tar.gz
Merge branch '2361-key-file-locale-caching' into 'master'
gkeyfile: Fix crash when parsing translations on a second load Closes #2361 See merge request GNOME/glib!2009
-rw-r--r--glib/gkeyfile.c3
-rw-r--r--glib/tests/keyfile.c43
2 files changed, 45 insertions, 1 deletions
diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c
index 50859164b..0b58edb3f 100644
--- a/glib/gkeyfile.c
+++ b/glib/gkeyfile.c
@@ -648,6 +648,7 @@ g_key_file_clear (GKeyFile *key_file)
g_strfreev (key_file->locales);
key_file->locales = NULL;
}
+ key_file->checked_locales = FALSE;
if (key_file->parse_buffer)
{
@@ -1232,7 +1233,7 @@ g_key_file_locale_is_interesting (GKeyFile *key_file,
if (key_file->flags & G_KEY_FILE_KEEP_TRANSLATIONS)
return TRUE;
- if (!key_file->checked_locales && !key_file->locales)
+ if (!key_file->checked_locales)
{
key_file->locales = g_strdupv ((gchar **)g_get_language_names ());
key_file->checked_locales = TRUE;
diff --git a/glib/tests/keyfile.c b/glib/tests/keyfile.c
index 7530bc8c3..975ef8167 100644
--- a/glib/tests/keyfile.c
+++ b/glib/tests/keyfile.c
@@ -759,6 +759,48 @@ test_locale_string (void)
}
static void
+test_locale_string_multiple_loads (void)
+{
+ GKeyFile *keyfile = NULL;
+ GError *local_error = NULL;
+ gchar *old_locale = NULL;
+ guint i;
+ const gchar *data =
+ "[valid]\n"
+ "key1=v1\n"
+ "key1[de]=v1-de\n"
+ "key1[de_DE]=v1-de_DE\n"
+ "key1[de_DE.UTF8]=v1-de_DE.UTF8\n"
+ "key1[fr]=v1-fr\n"
+ "key1[en] =v1-en\n"
+ "key1[sr@Latn]=v1-sr\n";
+
+ g_test_summary ("Check that loading with translations multiple times works");
+ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2361");
+
+ old_locale = g_strdup (setlocale (LC_ALL, NULL));
+ g_setenv ("LANGUAGE", "de", TRUE);
+ setlocale (LC_ALL, "");
+
+ keyfile = g_key_file_new ();
+
+ for (i = 0; i < 3; i++)
+ {
+ g_key_file_load_from_data (keyfile, data, -1, G_KEY_FILE_NONE, &local_error);
+ g_assert_no_error (local_error);
+
+ check_locale_string_value (keyfile, "valid", "key1", "it", "v1");
+ check_locale_string_value (keyfile, "valid", "key1", "de", "v1-de");
+ check_locale_string_value (keyfile, "valid", "key1", "de_DE", "v1-de");
+ }
+
+ g_key_file_free (keyfile);
+
+ setlocale (LC_ALL, old_locale);
+ g_free (old_locale);
+}
+
+static void
test_lists (void)
{
GKeyFile *keyfile;
@@ -1791,6 +1833,7 @@ main (int argc, char *argv[])
g_test_add_func ("/keyfile/boolean", test_boolean);
g_test_add_func ("/keyfile/number", test_number);
g_test_add_func ("/keyfile/locale-string", test_locale_string);
+ g_test_add_func ("/keyfile/locale-string/multiple-loads", test_locale_string_multiple_loads);
g_test_add_func ("/keyfile/lists", test_lists);
g_test_add_func ("/keyfile/lists-set-get", test_lists_set_get);
g_test_add_func ("/keyfile/group-remove", test_group_remove);