diff options
author | Father Chrysostomos <sprout@cpan.org> | 2011-06-05 22:37:54 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2011-06-05 22:37:54 -0700 |
commit | 71edc89419f11505f2cdaba9b13be65582d7f011 (patch) | |
tree | cf31dd4ce22fa560605fb40843d1a50e8e77e102 /ext/PerlIO-scalar | |
parent | c0b72abc47a28e2094e4ffc331df81433920bb63 (diff) | |
download | perl-71edc89419f11505f2cdaba9b13be65582d7f011.tar.gz |
[perl #92258] <$fh> hangs on a glob copy
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.
Diffstat (limited to 'ext/PerlIO-scalar')
-rw-r--r-- | ext/PerlIO-scalar/scalar.xs | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/ext/PerlIO-scalar/scalar.xs b/ext/PerlIO-scalar/scalar.xs index de9873829c..e0f75acf1a 100644 --- a/ext/PerlIO-scalar/scalar.xs +++ b/ext/PerlIO-scalar/scalar.xs @@ -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 * |