This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #123790] Assert fail with *x=<y>
authorFather Chrysostomos <sprout@cpan.org>
Wed, 25 Mar 2015 17:33:44 +0000 (10:33 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 25 Mar 2015 22:49:13 +0000 (15:49 -0700)
When assigning undef to its target, readline needs to take into
account that it might be a typeglob.  sv_setsv knows how handle this,
but SvOK_off is simply wrong.

This fixes this particular crash, but other issues in the ticket are
as yet unresolved.

pp_hot.c
t/op/readline.t

index f2468f9..67b78f3 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1633,8 +1633,7 @@ Perl_do_readline(pTHX)
        if (gimme == G_SCALAR) {
            /* undef TARG, and push that undefined value */
            if (type != OP_RCATLINE) {
-               SV_CHECK_THINKFIRST_COW_DROP(TARG);
-               SvOK_off(TARG);
+               sv_setsv(TARG,NULL);
            }
            PUSHTARG;
        }
index dd8d469..bfe90d5 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 
-plan tests => 31;
+plan tests => 32;
 
 # [perl #19566]: sv_gets writes directly to its argument via
 # TARG. Test that we respect SvREADONLY.
@@ -275,6 +275,15 @@ is tell, tell *foom, 'readline *$glob_copy sets PL_last_in_gv';
 readline undef;
 is ${^LAST_FH}, undef, '${^LAST_FH} after readline undef';
 
+{
+    my $w;
+    local($SIG{__WARN__},$^W) = (sub { $w .= shift }, 1);
+    *x=<y>;
+    like $w, qr/^readline\(\) on unopened filehandle y at .*\n(?x:
+                )Undefined value assigned to typeglob at .*\n\z/,
+        '[perl #123790] *x=<y> used to fail an assertion';
+}
+
 __DATA__
 moo
 moo