>From f2b522477945905e534d9eae4315a8337612905c Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 17 Dec 2019 14:10:45 +0100 Subject: [PATCH 3/3] nl_langinfo: Fix multithread-safety bug on OpenBSD 3.8. * lib/nl_langinfo.c (ctype_codeset): Invoke setlocale_null instead of setlocale. * m4/nl_langinfo.m4 (gl_FUNC_NL_LANGINFO): Require gl_FUNC_SETLOCALE_NULL. Set LIB_NL_LANGINFO. * modules/nl_langinfo (Depends-on): Add setlocale-null. --- ChangeLog | 9 +++++++++ lib/nl_langinfo.c | 9 +++++++-- m4/nl_langinfo.m4 | 10 +++++++++- modules/nl_langinfo | 1 + 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index bb6b22b..a42ab8e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2019-12-17 Bruno Haible + nl_langinfo: Fix multithread-safety bug on OpenBSD 3.8. + * lib/nl_langinfo.c (ctype_codeset): Invoke setlocale_null instead of + setlocale. + * m4/nl_langinfo.m4 (gl_FUNC_NL_LANGINFO): Require + gl_FUNC_SETLOCALE_NULL. Set LIB_NL_LANGINFO. + * modules/nl_langinfo (Depends-on): Add setlocale-null. + +2019-12-17 Bruno Haible + nl_langinfo: Fix multithread-safety bug on mingw and MSVC. * lib/nl_langinfo.c (ctype_codeset, rpl_nl_langinfo): Use a stack-allocated buffer to assemble each result and different static diff --git a/lib/nl_langinfo.c b/lib/nl_langinfo.c index 2c4d3a4..ff0e936 100644 --- a/lib/nl_langinfo.c +++ b/lib/nl_langinfo.c @@ -47,9 +47,14 @@ ctype_codeset (void) { static char result[2 + 10 + 1]; char buf[2 + 10 + 1]; - char const *locale = setlocale (LC_CTYPE, NULL); - char *codeset = buf; + char locale[SETLOCALE_NULL_MAX]; + char *codeset; size_t codesetlen; + + if (setlocale_null (LC_CTYPE, locale, sizeof (locale))) + locale[0] = '\0'; + + codeset = buf; codeset[0] = '\0'; if (locale && locale[0]) diff --git a/m4/nl_langinfo.m4 b/m4/nl_langinfo.m4 index 66eee41..c62d8e7 100644 --- a/m4/nl_langinfo.m4 +++ b/m4/nl_langinfo.m4 @@ -1,4 +1,4 @@ -# nl_langinfo.m4 serial 6 +# nl_langinfo.m4 serial 7 dnl Copyright (C) 2009-2019 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -10,6 +10,7 @@ AC_DEFUN([gl_FUNC_NL_LANGINFO], AC_REQUIRE([gl_LANGINFO_H]) AC_CHECK_FUNCS_ONCE([nl_langinfo]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_REQUIRE([gl_FUNC_SETLOCALE_NULL]) if test $ac_cv_func_nl_langinfo = yes; then # On Irix 6.5, YESEXPR is defined, but nl_langinfo(YESEXPR) is broken. AC_CACHE_CHECK([whether YESEXPR works], @@ -50,4 +51,11 @@ AC_DEFUN([gl_FUNC_NL_LANGINFO], else HAVE_NL_LANGINFO=0 fi + if test $HAVE_NL_LANGINFO = 0 || test $HAVE_LANGINFO_CODESET = 0; then + LIB_NL_LANGINFO="$LIB_SETLOCALE_NULL" + else + LIB_NL_LANGINFO= + fi + dnl LIB_NL_LANGINFO is expected to be empty everywhere. + AC_SUBST([LIB_NL_LANGINFO]) ]) diff --git a/modules/nl_langinfo b/modules/nl_langinfo index cd8ce44..aeeec09 100644 --- a/modules/nl_langinfo +++ b/modules/nl_langinfo @@ -8,6 +8,7 @@ m4/nl_langinfo.m4 Depends-on: langinfo localeconv [test $HAVE_NL_LANGINFO = 0 || test $REPLACE_NL_LANGINFO = 1] +setlocale-null [test $HAVE_NL_LANGINFO = 0 || test $HAVE_LANGINFO_CODESET = 0] configure.ac: gl_FUNC_NL_LANGINFO -- 2.7.4