summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2011-06-05 19:47:32 +0200
committerNicholas Clark <nick@ccl4.org>2011-06-11 08:48:14 +0200
commit9f3ee5ee9bc539518437e56340843b97afc63320 (patch)
treeaec4c635fb07c5e948f99f0e1c03d37a17c68344
parent4a7f5a626835258b740c432e3a607b06a429ed33 (diff)
downloadperl-9f3ee5ee9bc539518437e56340843b97afc63320.tar.gz
IPC::Open3::open3() couldn't duplicate numeric file descriptors on Windows.
-rw-r--r--ext/IPC-Open3/lib/IPC/Open3.pm6
-rw-r--r--ext/IPC-Open3/t/fd.t22
-rw-r--r--pod/perldelta.pod4
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 *