Skip to content

Commit

Permalink
PerlIO::scalar: allow writing to SvIOK SVs
Browse files Browse the repository at this point in the history
It used to crash if the PVX buffer happened to be null.
If the PVX buffer happened to be left over from before,
it would use that instead of the numeric value, even for
!SvPOK scalars.
  • Loading branch information
Father Chrysostomos committed Jan 6, 2012
1 parent 726c8e7 commit c5a04db
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
4 changes: 2 additions & 2 deletions ext/PerlIO-scalar/scalar.xs
Expand Up @@ -163,8 +163,8 @@ PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
SV *sv = s->var;
char *dst;
SvGETMAGIC(sv);
if (SvROK(sv)) SvPV_force_nomg_nolen(sv);
else sv_force_normal(sv);
if (!SvROK(sv)) sv_force_normal(sv);
if (SvOK(sv)) SvPV_force_nomg_nolen(sv);
if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND) {
dst = SvGROW(sv, SvCUR(sv) + count);
offset = SvCUR(sv);
Expand Down
16 changes: 14 additions & 2 deletions ext/PerlIO-scalar/t/scalar.t
Expand Up @@ -16,7 +16,7 @@ use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END); # Not 0, 1, 2 everywhere.

$| = 1;

use Test::More tests => 74;
use Test::More tests => 76;

my $fh;
my $var = "aaa\n";
Expand Down Expand Up @@ -285,17 +285,29 @@ EOF
'seek beyond end end of string followed by read';
}

# Writing to COW scalars and refs
# Writing to COW scalars and non-PVs
{
my $bovid = __PACKAGE__;
open my $handel, ">", \$bovid;
print $handel "the COW with the crumpled horn";
is $bovid, "the COW with the crumpled horn", 'writing to COW scalars';

package lrcg { use overload fallback => 1, '""'=>sub { 'chin' } }
seek $handel, 3, 0;
$bovid = bless [], lrcg::;
print $handel 'mney';
is $bovid, 'chimney', 'writing to refs';

seek $handel, 1, 0;
$bovid = 42; # still has a PV
print $handel 5;
is $bovid, 45, 'writing to numeric scalar';

seek $handel, 1, 0;
undef $bovid;
$bovid = 42; # just IOK
print $handel 5;
is $bovid, 45, 'writing to numeric scalar';
}

# [perl #92706]
Expand Down

0 comments on commit c5a04db

Please sign in to comment.