This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
locale.c: Avoid writing libc static storage
authorKarl Williamson <public@khwilliamson.com>
Thu, 12 Dec 2013 02:00:15 +0000 (19:00 -0700)
committerKarl Williamson <public@khwilliamson.com>
Sat, 4 Jan 2014 20:33:04 +0000 (13:33 -0700)
I don't believe this code was causing any problem, but it can overwrite
static storage returned by setlocale().  It's safer to create a copy
first.

locale.c

index 3c891b5..2bae987 100644 (file)
--- a/locale.c
+++ b/locale.c
@@ -687,18 +687,18 @@ S_is_cur_LC_category_utf8(pTHX_ int category)
 #endif
 
     /* First dispose of the trivial cases */
-    save_input_locale = stdize_locale(setlocale(category, NULL));
+    save_input_locale = setlocale(category, NULL);
     if (! save_input_locale) {
         return FALSE;   /* XXX maybe should croak */
     }
+    save_input_locale = stdize_locale(savepv(save_input_locale));
     if ((*save_input_locale == 'C' && save_input_locale[1] == '\0')
         || strEQ(save_input_locale, "POSIX"))
     {
+        Safefree(save_input_locale);
         return FALSE;
     }
 
-    save_input_locale = savepv(save_input_locale);
-
 #if defined(HAS_NL_LANGINFO) && defined(CODESET) && defined(USE_LOCALE_CTYPE)
 
     { /* Next try nl_langinfo if available */