develooper Front page | perl.perl5.porters | Postings from July 2012

[perl #113982] Reopening filehandles can clobber PerlIO layers

Thread Previous
From:
Darin McBride
Date:
July 4, 2012 07:59
Subject:
[perl #113982] Reopening filehandles can clobber PerlIO layers
Message ID:
rt-3.6.HEAD-28836-1341413963-1894.113982-75-0@perl.org
# New Ticket Created by  Darin McBride 
# Please include the string:  [perl #113982]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org:443/rt3/Ticket/Display.html?id=113982 >



This is a bug report for perl from dmcbride@cpan.org,
generated with the help of perlbug 1.39 running under perl 5.16.0.


-----------------------------------------------------------------
[Please describe your issue here]

(Originally found on AIX with 5.10.1, but can be reproduced in 5.16.0
on Linux.)

The following code has two surprises.

a) the layers for STDOUT are different for input vs output.
b) the layers for STDOUT's output are missing the utf8 layer after
   the reopening.  (They're missing for $fh, too.)

(Thanks to #perl for pointing me to PerlIO and that the layers can
be different, and to leont on #p5p for pointing me to re-opening issues.)

---

#!/bin/env perl5.16.0

use strict;
use warnings;
use 5.10.1;

say "Testing on $^V:";

binmode STDOUT, ':utf8';

say "Layers before:";
say "   $_" for PerlIO::get_layers(*STDOUT);
say " --------";
say "   $_" for PerlIO::get_layers(*STDOUT, output => 1);
'utf8' ~~ [ PerlIO::get_layers(*STDOUT, output => 1) ] or die "Huh?";

open my $fh, '>&STDOUT' or die "can't dup"; open STDOUT, '>&', $fh  or die "can't dup2";

say "Layers after:";
say "   $_" for PerlIO::get_layers(*STDOUT);
say " --------";
say "   $_" for PerlIO::get_layers(*STDOUT, output => 1);
'utf8' ~~ [ PerlIO::get_layers(*STDOUT, output => 1) ] or die "Huh2?";

---

Output:

$ perl5.16.0 ./x.pl
Testing on v5.16.0:
Layers before:
   unix
   perlio
   utf8
 --------
   unix
   perlio
   utf8
Layers after:
   unix
   perlio
   utf8
 --------
   unix
   perlio


[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
    category=core
    severity=medium
---
Site configuration information for perl 5.16.0:

Configured by nobody at Wed Jun 13 14:08:00 MDT 2012.

Summary of my perl5 (revision 5 version 16 subversion 0) configuration:
   
  Platform:
    osname=linux, osvers=3.2.12-gentoo, archname=x86_64-linux-thread-multi
    uname='linux naboo 3.2.12-gentoo #2 smp sun jun 3 01:06:44 mdt 2012 x86_64 intel(r) core(tm) i7 cpu 930 @ 2.80ghz genuineintel gnulinux '
    config_args='-desr -Duse64bitall -Dusethreads -Dprefix=/opt/myperl/5.16.0'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector'
    ccversion='', gccversion='4.5.3', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
    libpth=/usr/local/lib /lib/../lib64 /usr/lib/../lib64 /lib /usr/lib /lib64 /usr/lib64 /usr/local/lib64
    libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc -lgdbm_compat
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=/lib/libc-2.14.1.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.14.1'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector'

Locally applied patches:
    

---
@INC for perl 5.16.0:
    /opt/myperl/5.16.0/lib/site_perl/5.16.0/x86_64-linux-thread-multi
    /opt/myperl/5.16.0/lib/site_perl/5.16.0
    /opt/myperl/5.16.0/lib/5.16.0/x86_64-linux-thread-multi
    /opt/myperl/5.16.0/lib/5.16.0
    .

---
Environment for perl 5.16.0:
    HOME=/home/dmcbride
    LANG=en_US.utf8
    LANGUAGE=
    LC_ALL=en_US.utf8
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/usr/local/bin:/share/cvs/work:/home/dmcbride/bin:/usr/lib/distcc/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.5.3:/usr/x86_64-pc-linux-gnu/i686-pc-linux-gnu/gcc-bin/4.5.3:/share/cvs/bin:/usr/games/bin:/share/bin:/share/darin/bin:/share/cvs/work/shared
    PERL_BADLANG (unset)
    SHELL=/bin/bash


Thread Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About