[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]