This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: GH #17081: Workaround glibc bug with LC_MESSAGES
authorKarl Williamson <khw@cpan.org>
Thu, 28 Nov 2019 02:15:11 +0000 (19:15 -0700)
committerKarl Williamson <khw@cpan.org>
Sat, 30 Nov 2019 19:08:18 +0000 (12:08 -0700)
commit45cef8fb80248a6318f90219499ff2dbd953ae8c
tree28d06dd372781f9e74576830f146e1619f1e9074
parentdf6bd76f98839f1564209d4723f1b8599e14b2f9
PATCH: GH #17081: Workaround glibc bug with LC_MESSAGES

Please see the ticket for a full explanation.  This bug has been
submitted to glibc, without any real action forthcoming so far.

This invalidates the message cache each time the locale of LC_MESSAGES
is changed, as glibc should be doing this when uselocale changes that,
but glibc fails to do so.

This patch is an extension to the one submitted by Niko Tyni++.

I don't know how to test it, since a test would rely on several
different locales in different languages being available, and that
depends on what's installed on the platform.  I suppose that one could
go through the available locales, and try to find three with different
wording for the same message.  Doing so however would trigger the bug,
and at the end, if we didn't get three that differed, we wouldn't know
we wouldn't know if it is because of the bug, or that they just didn't
exist on the system.

However, below is a perl program that demonstrated the patch worked.
You could adjust it to the available locales.  The buggy code shows the
same text for all locales.  The fixed shows three different languages.

use strict;

use Locale::gettext;
use POSIX;

$ENV{LANG} = 'C.UTF-8';

for my $lang (qw(fi_FI fr_FR en_US)) {
    $ENV{LANGUAGE} = $lang;
    setlocale(LC_MESSAGES, '');
    my $d = Locale::gettext->domain("bash");
    print $d->get('syntax error'), "\n";
}
locale.c