[gnome-desktop/mcatanzaro/uselocale-try-2: 4/4] gnome-languages: Use uselocale to avoid threadsafety issues



commit 74f8064291a492f05aaf47dd49d20bb7d89fc0df
Author: Michael Catanzaro <mcatanzaro gnome org>
Date:   Wed Feb 20 22:25:06 2019 -0600

    gnome-languages: Use uselocale to avoid threadsafety issues
    
    setlocale is MT-Unsafe!
    
    This version of the commit fixes #105.

 libgnome-desktop/gnome-languages.c | 53 +++++++++++++++++++++++---------------
 1 file changed, 32 insertions(+), 21 deletions(-)
---
diff --git a/libgnome-desktop/gnome-languages.c b/libgnome-desktop/gnome-languages.c
index 74959c55..74a2619c 100644
--- a/libgnome-desktop/gnome-languages.c
+++ b/libgnome-desktop/gnome-languages.c
@@ -286,15 +286,15 @@ gnome_normalize_locale (const char *locale)
 static gboolean
 language_name_is_valid (const char *language_name)
 {
-        gboolean  is_valid;
-        int lc_type_id = LC_MESSAGES;
-        g_autofree char *old_locale = NULL;
+        locale_t locale;
 
-        old_locale = g_strdup (setlocale (lc_type_id, NULL));
-        is_valid = setlocale (lc_type_id, language_name) != NULL;
-        setlocale (lc_type_id, old_locale);
+        locale = newlocale (LC_MESSAGES_MASK, language_name, (locale_t) 0);
+        if (locale != (locale_t) 0) {
+                freelocale (locale);
+                return TRUE;
+        }
 
-        return is_valid;
+        return FALSE;
 }
 
 static void
@@ -302,14 +302,16 @@ language_name_get_codeset_details (const char  *language_name,
                                    char       **pcodeset,
                                    gboolean    *is_utf8)
 {
-        g_autofree char *old_locale = NULL;
+        locale_t locale;
+        locale_t old_locale;
         const char *codeset = NULL;
 
-        old_locale = g_strdup (setlocale (LC_CTYPE, NULL));
-
-        if (setlocale (LC_CTYPE, language_name) == NULL)
+        locale = newlocale (LC_CTYPE_MASK, language_name, (locale_t) 0);
+        if (locale == (locale_t) 0)
                 return;
 
+        old_locale = uselocale (locale);
+
         codeset = nl_langinfo (CODESET);
 
         if (pcodeset != NULL) {
@@ -322,7 +324,8 @@ language_name_get_codeset_details (const char  *language_name,
                 *is_utf8 = strcmp (normalized_codeset, "UTF-8") == 0;
         }
 
-        setlocale (LC_CTYPE, old_locale);
+        uselocale (old_locale);
+        freelocale (locale);
 }
 
 /**
@@ -699,12 +702,15 @@ get_translated_language (const char *code,
 
         name = NULL;
         if (language != NULL) {
-                const char  *translated_name;
-                g_autofree char *old_locale = NULL;
+                const char *translated_name;
+                locale_t loc;
+                locale_t old_locale;
 
                 if (locale != NULL) {
-                        old_locale = g_strdup (setlocale (LC_MESSAGES, NULL));
-                        setlocale (LC_MESSAGES, locale);
+                        loc = newlocale (LC_MESSAGES_MASK, locale, (locale_t) 0);
+                        if (loc == (locale_t) 0)
+                                return NULL;
+                        old_locale = uselocale (loc);
                 }
 
                 if (is_fallback_language (code)) {
@@ -717,7 +723,8 @@ get_translated_language (const char *code,
                 }
 
                 if (locale != NULL) {
-                        setlocale (LC_MESSAGES, old_locale);
+                        uselocale (old_locale);
+                        freelocale (loc);
                 }
         }
 
@@ -754,12 +761,15 @@ get_translated_territory (const char *code,
         name = NULL;
         if (territory != NULL) {
                 const char *translated_territory;
-                g_autofree char *old_locale = NULL;
+                locale_t loc;
+                locale_t old_locale;
                 g_autofree char *tmp = NULL;
 
                 if (locale != NULL) {
-                        old_locale = g_strdup (setlocale (LC_MESSAGES, NULL));
-                        setlocale (LC_MESSAGES, locale);
+                        loc = newlocale (LC_MESSAGES_MASK, locale, (locale_t) 0);
+                        if (loc == (locale_t) 0)
+                                return NULL;
+                        old_locale = uselocale (loc);
                 }
 
                 translated_territory = dgettext ("iso_3166", territory);
@@ -767,7 +777,8 @@ get_translated_territory (const char *code,
                 name = capitalize_utf8_string (tmp);
 
                 if (locale != NULL) {
-                        setlocale (LC_MESSAGES, old_locale);
+                        uselocale (old_locale);
+                        freelocale (loc);
                 }
         }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]