This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Don't use duplocale() unless is present
authorKarl Williamson <khw@cpan.org>
Wed, 7 Mar 2018 17:20:53 +0000 (10:20 -0700)
committerKarl Williamson <khw@cpan.org>
Mon, 12 Mar 2018 17:10:02 +0000 (11:10 -0600)
Prior to this patch, the code assumed that if you have the other, more
significant, POSIX 2008 functions available, that duplocale was present
and correctly functioning too.

However, we found that there have been bugs in it, so that a hints file
or Configure probe might want to exclude just it.

ext/POSIX/POSIX.xs
locale.c

index cf744c7..bde6234 100644 (file)
@@ -2154,7 +2154,8 @@ localeconv()
        sv_2mortal((SV*)RETVAL);
 #  if defined(USE_ITHREADS)                         \
    && defined(HAS_POSIX_2008_LOCALE)                \
-   && defined(HAS_LOCALECONV_L)
+   && defined(HAS_LOCALECONV_L)                     \
+   && defined(HAS_DUPLOCALE)
 
         cur = uselocale((locale_t) 0);
         if (cur == LC_GLOBAL_LOCALE) {
index cf37173..6a4e012 100644 (file)
--- a/locale.c
+++ b/locale.c
@@ -2393,7 +2393,8 @@ S_my_nl_langinfo(const int item, bool toggle)
 
 #if defined(HAS_NL_LANGINFO) /* nl_langinfo() is available.  */
 #  if   ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L)      \
-     || ! defined(HAS_POSIX_2008_LOCALE)
+     || ! defined(HAS_POSIX_2008_LOCALE)              \
+     || ! defined(DUPLOCALE)
 
     /* Here, use plain nl_langinfo(), switching to the underlying LC_NUMERIC
      * for those items dependent on it.  This must be copied to a buffer before
@@ -5032,7 +5033,9 @@ Perl_my_strerror(pTHX_ const int errnum)
         do_setlocale_c(LC_MESSAGES, save_locale);
     }
 
-#  elif defined(HAS_POSIX_2008_LOCALE) && defined(HAS_STRERROR_L)
+#  elif defined(HAS_POSIX_2008_LOCALE)                      \
+     && defined(HAS_STRERROR_L)                             \
+     && defined(HAS_DUPLOCALE)
 
     /* This function is also trivial if we don't have to worry about thread
      * safety and have strerror_l(), as it handles the switch of locales so we