diff options
author | Nicholas Clark <nick@ccl4.org> | 2011-06-05 19:47:32 +0200 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2011-06-11 08:48:14 +0200 |
commit | 9f3ee5ee9bc539518437e56340843b97afc63320 (patch) | |
tree | aec4c635fb07c5e948f99f0e1c03d37a17c68344 | |
parent | 4a7f5a626835258b740c432e3a607b06a429ed33 (diff) | |
download | perl-9f3ee5ee9bc539518437e56340843b97afc63320.tar.gz |
IPC::Open3::open3() couldn't duplicate numeric file descriptors on Windows.
-rw-r--r-- | ext/IPC-Open3/lib/IPC/Open3.pm | 6 | ||||
-rw-r--r-- | ext/IPC-Open3/t/fd.t | 22 | ||||
-rw-r--r-- | pod/perldelta.pod | 4 |
3 files changed, 28 insertions, 4 deletions
diff --git a/ext/IPC-Open3/lib/IPC/Open3.pm b/ext/IPC-Open3/lib/IPC/Open3.pm index dc19cea549..879b902d8e 100644 --- a/ext/IPC-Open3/lib/IPC/Open3.pm +++ b/ext/IPC-Open3/lib/IPC/Open3.pm @@ -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; diff --git a/ext/IPC-Open3/t/fd.t b/ext/IPC-Open3/t/fd.t index 1e7632f254..354ebd1aa9 100644 --- a/ext/IPC-Open3/t/fd.t +++ b/ext/IPC-Open3/t/fd.t @@ -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' + ); +} diff --git a/pod/perldelta.pod b/pod/perldelta.pod index b11b43dab0..bea7ea43ff 100644 --- a/pod/perldelta.pod +++ b/pod/perldelta.pod @@ -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 * |