A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/Perl/perl5/issues/19882 below:

select() reacts improperly to UTF8-flagged strings · Issue #19882 · Perl/perl5 · GitHub

Description
Perl’s select() has the “Unicode bug”.

The impact is low, but the fix is trivial.

The potential for breakage seems low enough that this one is OK to fix.

Steps to Reproduce

#!/usr/bin/env perl

use strict;
use warnings;

use Test::More;

use File::Temp;

my $mask;
my @fhs;

while (!defined $mask) {
    push @fhs, scalar File::Temp::tempfile();
    vec( my $curmask, fileno($fhs[-1]), 1 ) = 1;

    if ($curmask =~ m<[\x80-\xff]>) {
        $mask = $curmask;
    }
}

print "FD: " . fileno($fhs[-1]) . $/;

my $result = select $mask, undef, undef, 0;
print "error: $!" if $result == -1;

is($result, 1, 'file is readable (downgraded input to select)');

utf8::upgrade($mask);

$result = select $mask, undef, undef, 0;

is($result, 1, 'file is readable (upgraded input to select)');

done_testing;

Expected behavior
The strace output of the 2nd one-liner should match that of the first one.

Perl configuration
This happens in blead as of now.

This fixes it:

diff --git a/pp_sys.c b/pp_sys.c
index a3bc0794a2..6bfa98f14f 100644
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -1165,7 +1165,10 @@ PP(pp_sselect)
                 Perl_croak_no_modify();
         }
         else if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
-        if (!SvPOK(sv)) {
+        if (SvPOK(sv)) {
+            if (SvUTF8(sv)) sv_utf8_downgrade(sv, FALSE);
+        }
+        else {
             if (!SvPOKp(sv))
                 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
                                     "Non-string passed as bitmask");

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4