IPC::Open3::open3() couldn't duplicate numeric file descriptors on Windows.
authorNicholas Clark <nick@ccl4.org>
Sun, 5 Jun 2011 17:47:32 +0000 (19:47 +0200)
committerNicholas Clark <nick@ccl4.org>
Sat, 11 Jun 2011 06:48:14 +0000 (08:48 +0200)
ext/IPC-Open3/lib/IPC/Open3.pm
ext/IPC-Open3/t/fd.t
pod/perldelta.pod

index dc19cea..879b902 100644 (file)
@@ -325,20 +325,20 @@ sub _open3 {
 
        my @close;
        if ($dup_wtr) {
-         $kid_rdr = \*{$dad_wtr};
+         $kid_rdr = $dad_wtr =~ /\A[0-9]+\z/ ? $dad_wtr : \*{$dad_wtr};
          push @close, $kid_rdr;
        } else {
          push @close, \*{$dad_wtr}, $kid_rdr;
        }
        if ($dup_rdr) {
-         $kid_wtr = \*{$dad_rdr};
+         $kid_wtr = $dad_rdr =~ /\A[0-9]+\z/ ? $dad_rdr : \*{$dad_rdr};
          push @close, $kid_wtr;
        } else {
          push @close, \*{$dad_rdr}, $kid_wtr;
        }
        if ($dad_rdr ne $dad_err) {
            if ($dup_err) {
-             $kid_err = \*{$dad_err};
+             $kid_err = $dad_err =~ /\A[0-9]+\z/ ? $dad_err : \*{$dad_err};
              push @close, $kid_err;
            } else {
              push @close, \*{$dad_err}, $kid_err;
index 1e7632f..354ebd1 100644 (file)
@@ -14,7 +14,7 @@ BEGIN {
 use strict;
 use warnings;
 
-plan 1;
+plan 3;
 
 # [perl #76474]
 {
@@ -27,3 +27,23 @@ plan 1;
   is $stderr, '',
    "dup STDOUT in a child process by using its file descriptor";
 }
+
+{
+  my $want = qr/\A# This Makefile is for the IPC::Open3 extension to perl\.\r?\z/;
+  open my $fh, '<', 'Makefile' or die "Can't open MAKEFILE: $!";
+  my $have = <$fh>;
+  chomp $have;
+  like($have, $want, 'No surprises from MakeMaker');
+  close $fh;
+
+  fresh_perl_like(<<'EOP',
+use IPC::Open3;
+open FOO, 'Makefile' or die $!;
+open3('<&' . fileno FOO, my $out, undef, $ENV{PERLEXE}, '-eprint scalar <STDIN>');
+print <$out>;
+EOP
+                 $want,
+                 undef,
+                 'Numeric file handles are duplicated correctly'
+      );
+}
index b11b43d..bea7ea4 100644 (file)
@@ -241,6 +241,10 @@ L<IPC::Open3> has been upgraded from version 1.10 to version 1.11.
 Fixes a bug which prevented use of open3 on Windows when *STDIN, *STDOUT or
 *STDERR had been localized.
 
+=item *
+
+Fixes a bug which prevented duplicating numeric file descriptors on Windows.
+
 =back
 
 =item *