[perl #92258] <$fh> hangs on a glob copy
authorFather Chrysostomos <sprout@cpan.org>
Mon, 6 Jun 2011 05:37:54 +0000 (22:37 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 6 Jun 2011 05:37:54 +0000 (22:37 -0700)
Opening a file handle to \$glob causes assertion failures
(under debugging) or hangs or other erratic behaviour without
debugging. This might even crash in some cases.

It never really worked properly, but it didn’t start hanging
apparently until 5.12.2 and 5.14.0.

ext/PerlIO-scalar/scalar.xs
t/io/perlio.t

index de98738..e0f75ac 100644 (file)
@@ -240,9 +240,13 @@ PerlIOScalar_get_cnt(pTHX_ PerlIO * f)
 {
     if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
        PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
+       STRLEN len;
        SvGETMAGIC(s->var);
-       if (SvCUR(s->var) > (STRLEN) s->posn)
-           return SvCUR(s->var) - (STRLEN)s->posn;
+       if (isGV_with_GP(s->var))
+           (void)SvPV(s->var,len);
+       else len = SvCUR(s->var);
+       if (len > (STRLEN) s->posn)
+           return len - (STRLEN)s->posn;
        else
            return 0;
     }
@@ -264,9 +268,12 @@ void
 PerlIOScalar_set_ptrcnt(pTHX_ PerlIO * f, STDCHAR * ptr, SSize_t cnt)
 {
     PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
+    STRLEN len;
     PERL_UNUSED_ARG(ptr);
     SvGETMAGIC(s->var);
-    s->posn = SvCUR(s->var) - cnt;
+    if (isGV_with_GP(s->var)) (void)SvPV(s->var,len);
+    else len = SvCUR(s->var);
+    s->posn = len - cnt;
 }
 
 PerlIO *
index 1a330f4..a65b0d3 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
        skip_all_without_perlio();
 }
 
-plan tests => 42;
+plan tests => 44;
 
 use_ok('PerlIO');
 
@@ -191,6 +191,12 @@ close ($perlio);
 close ($no_perlio);
 }
 
+{ # [perl #92258]
+    open my $fh, "<", \(my $f = *f);
+    is join("", <$fh>), '*main::f', 'reading from a glob copy';
+    is ref \$f, 'GLOB', 'the glob copy is unaffected';
+}
+
 }