]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Use thread-safe locale functions if available
authorRémi Denis-Courmont <remi@remlab.net>
Wed, 21 Apr 2010 16:37:48 +0000 (18:37 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 21 Apr 2010 17:20:39 +0000 (19:20 +0200)
setlocale() is not thread-safe. It can actually trigger a crash if
another thread uses locale informations at the same time in the process.
Library code should use POSIX newlocale/duplocale/uselocale/freelocale
instead. Those functions only change the locale data for the calling
thread.

Signed-off-by: Rémi Denis-Courmont <remi@remlab.net>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/conf.c

index 570c90fa6413779025dd61b329961e7f28c8118d..5d8c5c92fc2835c52d52929902683a6fb83d2872 100644 (file)
@@ -499,22 +499,38 @@ static int safe_strtod(const char *str, double *val)
 {
        char *end;
        double v;
+#ifdef HAVE_USELOCALE
+       locale_t saved_locale, c_locale;
+#else
        char *saved_locale;
        char locstr[64]; /* enough? */
+#endif
        int err;
 
        if (!*str)
                return -EINVAL;
+#ifdef HAVE_USELOCALE
+       c_locale = newlocale(LC_NUMERIC_MASK, "C", 0);
+       saved_locale = uselocale(c_locale);
+#else
        saved_locale = setlocale(LC_NUMERIC, NULL);
        if (saved_locale) {
                snprintf(locstr, sizeof(locstr), "%s", saved_locale);
                setlocale(LC_NUMERIC, "C");
        }
+#endif
        errno = 0;
        v = strtod(str, &end);
        err = -errno;
+#ifdef HAVE_USELOCALE
+       if (c_locale != (locale_t)0) {
+               uselocale(saved_locale);
+               freelocale(c_locale);
+       }
+#else
        if (saved_locale)
                setlocale(LC_NUMERIC, locstr);
+#endif
        if (err)
                return err;
        if (*end)