A fix for [perl #31692] : as PerlIO::scalar accesses directly the
Rafael Garcia-Suarez [Thu, 30 Sep 2004 15:12:29 +0000 (15:12 +0000)]
PV of the scalar it reads from, avoid to read it when it's an
undefined PV.

p4raw-id: //depot/perl@23340

ext/PerlIO/scalar/scalar.xs
ext/PerlIO/t/scalar.t

index 193b99f..c116f07 100644 (file)
@@ -39,7 +39,7 @@ PerlIOScalar_pushed(pTHX_ PerlIO * f, const char *mode, SV * arg,
     }
     SvUPGRADE(s->var, SVt_PV);
     code = PerlIOBase_pushed(aTHX_ f, mode, Nullsv, tab);
-    if ((PerlIOBase(f)->flags) & PERLIO_F_TRUNCATE)
+    if (!SvOK(s->var) || (PerlIOBase(f)->flags) & PERLIO_F_TRUNCATE)
        SvCUR(s->var) = 0;
     if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND)
        s->posn = SvCUR(s->var);
index 4021d43..818aab5 100644 (file)
@@ -15,7 +15,7 @@ BEGIN {
 }
 
 $| = 1;
-print "1..25\n";
+print "1..26\n";
 
 my $fh;
 my $var = "ok 2\n";
@@ -143,3 +143,9 @@ print <$fh>;
     close $fh;
     print $ok ? "ok 25\n" : "not ok 25\n";
 }
+
+my $data = "a non-empty PV";
+$data = undef;
+open(MEM, '<', \$data) or die "Fail: $!\n";
+my $x = join '', <MEM>;
+print $x eq '' ? "ok 26\n" : "not ok 26\n";