Check for deleted stashes when reporting var names
authorFlorian Ragwitz <rafl@debian.org>
Tue, 16 Nov 2010 06:14:04 +0000 (07:14 +0100)
committerFlorian Ragwitz <rafl@debian.org>
Tue, 16 Nov 2010 06:26:24 +0000 (07:26 +0100)
The stash of the GV is what's being used to look up a global variables name. If
the GV has no stash, we might as well give up early. This fixes a segfault
because S_varname would later assume gv_fullname4 has resolved the glob's full
name and try to use the svu_pv slot of the scalar returned, while all it got
back was undef.

sv.c
t/lib/warnings/9uninit

diff --git a/sv.c b/sv.c
index 57db4f4..3d5dc68 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -13695,7 +13695,7 @@ S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
 
     case OP_GVSV:
        gv = cGVOPx_gv(obase);
-       if (!gv || (match && GvSV(gv) != uninit_sv))
+       if (!gv || (match && GvSV(gv) != uninit_sv) || !GvSTASH(gv))
            break;
        return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
 
index 93c3dec..bb3738a 100644 (file)
@@ -1938,3 +1938,10 @@ my $v;
 __END__
 EXPECT
 Use of uninitialized value in addition (+) at - line 3.
+########
+use warnings 'uninitialized';
+delete $::{'Foo::'};
+my $moo = $Foo::BAR + 42;
+__END__
+EXPECT
+Use of uninitialized value in addition (+) at - line 3.