Fix a case of segfault in gv_check(), by making
Rafael Garcia-Suarez [Sat, 31 May 2003 19:54:31 +0000 (19:54 +0000)]
it ignore non-GV values in stashes.

p4raw-id: //depot/perl@19652

gv.c
t/op/stash.t

diff --git a/gv.c b/gv.c
index 95d4d36..41feaa2 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -1156,7 +1156,7 @@ Perl_gv_check(pTHX_ HV *stash)
     for (i = 0; i <= (I32) HvMAX(stash); i++) {
        for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
            if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
-               (gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)))
+               (gv = (GV*)HeVAL(entry)) && isGV(gv) && (hv = GvHV(gv)))
            {
                if (hv != PL_defstash && hv != stash)
                     gv_check(hv);              /* nested package */
index c8fe0ae..0cd7ebf 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
 
 require "./test.pl";
 
-plan( tests => 1 );
+plan( tests => 2 );
 
 # Used to segfault (bug #15479)
 fresh_perl_is(
@@ -16,3 +16,11 @@ fresh_perl_is(
     { switches => [ '-w' ] },
     'delete $::{STDERR} and print a warning',
 );
+
+# Used to segfault
+fresh_perl_is(
+    'BEGIN { $::{"X::"} = 2 }',
+    '',
+    { switches => [ '-w' ] },
+    q(Insert a non-GV in a stash, under warnings 'once'),
+);