[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]
Re: [ID 19991230.002] repeated pipe open broken
On Thu, 30 Dec 1999 13:15:14 PST, I wrote:
>On Thu, 30 Dec 1999 19:07:33 +0100, "Andreas J. Koenig" wrote:
>>% ./perl5.005_58/perl -e 'print $], "\n";
>>for (1,2,3){
>> open P, "echo foo|" or print "not ";
>> print "ok $_\n";
>>}
>>'
>>5.00558
>>ok 1
>>not ok 2
>>not ok 3
>
>This appears to be due to:
>
> [ 3786] By: gsar on 1999/07/27 06:30:09
> Log: applied suggested patch; added missing prototype changes to
> opcode.pl along with documentation typos (feature still needs
> to be described in perlopentut.pod and summarized in
> perldelta.pod)
> From: Ilya Zakharevich <ilya@math.ohio-state.edu>
> Date: Thu, 17 Jun 1999 00:39:34 -0400 (EDT)
> Message-Id: <199906170439.AAA18154@monk.mps.ohio-state.edu>
> Subject: [PATCH 5.00557] 3-arg open
> Branch: perl
> ! doio.c embed.h embed.pl global.sym objXSUB.h opcode.h
> ! opcode.pl perlapi.c pod/perldiag.pod pod/perlfunc.pod pp_sys.c
> ! proto.h t/comp/proto.t t/io/open.t
>
>Here's one clue:
>
> % perl -le '$_ = "echo x|"; open P, $_ or die; print'
> echo x
> ^
>Note missing "|" at end.
This patch is meant to fix that.
Sarathy
gsar@ActiveState.com
-----------------------------------8<-----------------------------------
Change 4757 by gsar@auger on 2000/01/05 12:48:10
severe bugs in change#3786 fixed
Affected files ...
... //depot/perl/doio.c#90 edit
... //depot/perl/t/io/open.t#12 edit
Differences ...
==== //depot/perl/doio.c#90 (text) ====
Index: perl/doio.c
--- perl/doio.c.~1~ Wed Jan 5 04:48:15 2000
+++ perl/doio.c Wed Jan 5 04:48:15 2000
@@ -183,28 +183,29 @@
}
}
else {
- char *myname;
- char *type = name;
- char *otype = name;
+ char *type;
+ char *oname = name;
STRLEN tlen;
- STRLEN otlen = len;
+ STRLEN olen = len;
char mode[3]; /* stdio file mode ("r\0" or "r+\0") */
int dodup;
+ type = savepvn(name, len);
+ tlen = len;
+ SAVEFREEPV(type);
if (num_svs) {
- type = name;
- name = SvPV(svs, tlen) ;
- len = (I32)tlen;
+ STRLEN l;
+ name = SvPV(svs, l) ;
+ len = (I32)l;
+ name = savepvn(name, len);
+ SAVEFREEPV(name);
}
-
- tlen = otlen;
- myname = savepvn(name, len);
- SAVEFREEPV(myname);
- name = myname;
- if (!num_svs)
+ else {
while (tlen && isSPACE(type[tlen-1]))
type[--tlen] = '\0';
-
+ name = type;
+ len = tlen;
+ }
mode[0] = mode[1] = mode[2] = '\0';
IoTYPE(io) = *type;
if (*type == '+' && tlen > 1 && type[tlen-1] != '|') { /* scary */
@@ -216,12 +217,14 @@
if (*type == '|') {
if (num_svs && (tlen != 2 || type[1] != '-')) {
unknown_desr:
- Perl_croak(aTHX_ "Unknown open() mode '%.*s'", otlen, otype);
+ Perl_croak(aTHX_ "Unknown open() mode '%.*s'", olen, oname);
}
/*SUPPRESS 530*/
- for (type++; isSPACE(*type); type++) ;
- if (!num_svs)
+ for (type++, tlen--; isSPACE(*type); type++, tlen--) ;
+ if (!num_svs) {
name = type;
+ len = tlen;
+ }
if (*name == '\0') { /* command is missing 19990114 */
dTHR;
if (ckWARN(WARN_PIPE))
@@ -232,9 +235,9 @@
if (strNE(name,"-") || num_svs)
TAINT_ENV();
TAINT_PROPER("piped open");
- if (name[strlen(name)-1] == '|') {
+ if (name[len-1] == '|') {
dTHR;
- name[strlen(name)-1] = '\0' ;
+ name[--len] = '\0' ;
if (ckWARN(WARN_PIPE))
Perl_warner(aTHX_ WARN_PIPE, "Can't open bidirectional pipe");
}
@@ -308,7 +311,7 @@
if (!(fp = PerlIO_fdopen(fd,mode))) {
if (dodup)
PerlLIO_close(fd);
- }
+ }
}
}
else {
==== //depot/perl/t/io/open.t#12 (xtext) ====
Index: perl/t/io/open.t
--- perl/t/io/open.t.~1~ Wed Jan 5 04:48:15 2000
+++ perl/t/io/open.t Wed Jan 5 04:48:15 2000
@@ -5,7 +5,7 @@
$^W = 1;
$Is_VMS = $^O eq 'VMS';
-print "1..64\n";
+print "1..66\n";
my $test = 1;
@@ -258,3 +258,12 @@
ok;
$@ =~ /Unknown open\(\) mode \'<&\'/ or print "not ";
ok;
+
+# 65..66
+{
+ local *F;
+ for (1..2) { open(F, "echo #foo|") or print "not "; }
+ ok;
+ for (1..2) { open(F, "-|", "echo #foo") or print "not "; }
+ ok;
+}
End of Patch.
- Follow-Ups from:
-
Ilya Zakharevich <ilya@math.ohio-state.edu>
- References to:
-
Gurusamy Sarathy <gsar@ActiveState.com>
[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]