This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix assertion failure with $#a=\1
authorFather Chrysostomos <sprout@cpan.org>
Fri, 26 Jul 2013 06:09:58 +0000 (23:09 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 22 Aug 2013 15:28:09 +0000 (08:28 -0700)
If the array has been freed and a reference is then assigned to
the arylen scalar and then get-magic is called on that scalar,
Perl_magic_getarylen misbehaves.  SvOK_off is not sufficient if
arbitrary values can be assigned by Perl code.  Globs, refs and
regexps (among others) need special handling, which sv_setsv
knows how to do.

mg.c
t/op/array.t

diff --git a/mg.c b/mg.c
index 5403f67..305817c 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -2020,7 +2020,7 @@ Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
     if (obj) {
        sv_setiv(sv, AvFILL(obj));
     } else {
-       SvOK_off(sv);
+       sv_setsv(sv, NULL);
     }
     return 0;
 }
index 1064ed7..4c3be2c 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     require 'test.pl';
 }
 
-plan (135);
+plan (136);
 
 #
 # @foo, @bar, and @ary are also used from tie-stdarray after tie-ing them
@@ -493,5 +493,9 @@ sub {
          'error when setting alias to -1 elem of empty array';
 }->($plink[0], $plink[-2], $plink[-5], $plunk[-1]);
 
+$_ = \$#{[]};
+$$_ = \1;
+"$$_";
+pass "no assertion failure after assigning ref to arylen when ary is gone";
 
 "We're included by lib/Tie/Array/std.t so we need to return something true";