In perl.git, the branch blead has been updated <https://perl5.git.perl.org/perl.git/commitdiff/b0bde64275270da224c60fb67b3402c48855f883?hp=6c34d5cdcda529066016688302cf91b9f1642ee3>
- Log ----------------------------------------------------------------- commit b0bde64275270da224c60fb67b3402c48855f883 Author: Karl Williamson <k...@cpan.org> Date: Tue Mar 13 12:08:16 2018 -0600 locale.c: Add savepv() to setlocale() returns The next call to setlocale can overwrite the returned value from the current call, depending on platform. Therefore, one should save the results. I forgot this in commit 39e69e777b8. Now fixing it. I also audited locale.c to find any other instances. There were several where setlocale() is called without saving, and that return is passed to a function. It may work now, but it's dangerous to rely on the function not getting changed in such a way as to do its own setlocale, expecting the input parameter to be unchanged. So save the returns from these as well, as a precaution. ----------------------------------------------------------------------- Summary of changes: locale.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/locale.c b/locale.c index cd50be9612..98d6d37135 100644 --- a/locale.c +++ b/locale.c @@ -2213,20 +2213,23 @@ Perl_setlocale(const int category, const char * locale) # ifdef USE_LOCALE_CTYPE - newlocale = do_setlocale_c(LC_CTYPE, NULL); + newlocale = savepv(do_setlocale_c(LC_CTYPE, NULL)); new_ctype(newlocale); + Safefree(newlocale); # endif /* USE_LOCALE_CTYPE */ # ifdef USE_LOCALE_COLLATE - newlocale = do_setlocale_c(LC_COLLATE, NULL); + newlocale = savepv(do_setlocale_c(LC_COLLATE, NULL)); new_collate(newlocale); + Safefree(newlocale); # endif # ifdef USE_LOCALE_NUMERIC - newlocale = do_setlocale_c(LC_NUMERIC, NULL); + newlocale = savepv(do_setlocale_c(LC_NUMERIC, NULL)); new_numeric(newlocale); + Safefree(newlocale); # endif /* USE_LOCALE_NUMERIC */ #endif /* LC_ALL */ @@ -5032,11 +5035,12 @@ Perl_my_strerror(pTHX_ const int errnum) errstr = savepv(strerror(errnum)); } else { - const char * save_locale = do_setlocale_c(LC_MESSAGES, NULL); + const char * save_locale = savepv(do_setlocale_c(LC_MESSAGES, NULL)); do_setlocale_c(LC_MESSAGES, "C"); errstr = savepv(strerror(errnum)); do_setlocale_c(LC_MESSAGES, save_locale); + Safefree(save_locale); } # elif defined(HAS_POSIX_2008_LOCALE) \ @@ -5316,29 +5320,32 @@ Perl_sync_locale() #endif #ifdef USE_LOCALE_CTYPE - newlocale = do_setlocale_c(LC_CTYPE, NULL); + newlocale = savepv(do_setlocale_c(LC_CTYPE, NULL)); DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s:%d: %s\n", __FILE__, __LINE__, setlocale_debug_string(LC_CTYPE, NULL, newlocale))); new_ctype(newlocale); + Safefree(newlocale); #endif /* USE_LOCALE_CTYPE */ #ifdef USE_LOCALE_COLLATE - newlocale = do_setlocale_c(LC_COLLATE, NULL); + newlocale = savepv(do_setlocale_c(LC_COLLATE, NULL)); DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s:%d: %s\n", __FILE__, __LINE__, setlocale_debug_string(LC_COLLATE, NULL, newlocale))); new_collate(newlocale); + Safefree(newlocale); #endif #ifdef USE_LOCALE_NUMERIC - newlocale = do_setlocale_c(LC_NUMERIC, NULL); + newlocale = savepv(do_setlocale_c(LC_NUMERIC, NULL)); DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s:%d: %s\n", __FILE__, __LINE__, setlocale_debug_string(LC_NUMERIC, NULL, newlocale))); new_numeric(newlocale); + Safefree(newlocale); #endif /* USE_LOCALE_NUMERIC */ -- Perl5 Master Repository