This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
(perl #133981) fix for Win32 setlocale() abort
authorTony Cook <tony@develop-help.com>
Wed, 24 Jul 2019 05:56:08 +0000 (15:56 +1000)
committerTony Cook <tony@develop-help.com>
Tue, 3 Sep 2019 00:59:36 +0000 (10:59 +1000)
commit6c3320363f6cd734c66a25852aac87e4f2538215
tree902b49a26d52929e21108a6b5bb18d62d660e03a
parent8714ff4fff9cfd29f80108bcdd43cfd7637999b9
(perl #133981) fix for Win32 setlocale() abort

This appears to abort because the supplied locale string isn't validly
encoded in the current code page, so we see the following steps:

1) an internal sizing call to mbstowcs_s() fails, but

2) the calling (CRT) code doesn't handle that, allocating a zero length
buffer

3) mbstowcs_s() is called with a buffer and a zero size, causing the
exception.

Since it's the conversion that fails, perform our own conversion.

Rather than using the current code page always use CP_UTF8, since
this is perl's typical non-Latin1 encoding.

Unfortunately we don't have the SVf_UTF8 flag at this point, so
all we can do is assume UTF-8.

This introduces a change in behaviour - previously locale names
were interpreted in the current code page, but most locale names
are ASCII, so it shouldn't matter.

One issue is that the return value is freed on the next LEAVE, but
all callers immediately use or copy the string.
locale.c