mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-01 22:58:49 -04:00
Use thread-safe locale functions if available
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>
This commit is contained in:
parent
51ef640cee
commit
8d80d5f344
1 changed files with 16 additions and 0 deletions
16
src/conf.c
16
src/conf.c
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue