Avoid a segfault case in MRO code, based on :
ilmari@vesla.ilmari.org [Thu, 21 Feb 2008 20:29:42 +0000 (12:29 -0800)]
Subject: [perl #51092] [PATCH] Segfault when calling ->next::method on non-existing package
From: ilmari@vesla.ilmari.org (via RT) <perlbug-followup@perl.org>
Message-ID: <rt-3.6.HEAD-15287-1203654581-377.51092-75-0@perl.org>

p4raw-id: //depot/perl@33367

mro.c
t/mro/next_edgecases.t

diff --git a/mro.c b/mro.c
index 83872dc..2d52805 100644 (file)
--- a/mro.c
+++ b/mro.c
@@ -954,7 +954,7 @@ XS(XS_mro_nextcan)
     if(sv_isobject(self))
         selfstash = SvSTASH(SvRV(self));
     else
-        selfstash = gv_stashsv(self, 0);
+        selfstash = gv_stashsv(self, GV_ADD);
 
     assert(selfstash);
 
index 91c2c85..ff3272d 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-require q(./test.pl); plan(tests => 11);
+require q(./test.pl); plan(tests => 12);
 
 {
 
@@ -78,5 +78,16 @@ require q(./test.pl); plan(tests => 11);
 
         eval { $baz->bar() };
         ok($@, '... calling bar() with next::method failed') || diag $@;
-    }    
+    }
+
+    # Test with non-existing class (used to segfault)
+    {
+        package Qux;
+        use mro;
+        sub foo { No::Such::Class->next::can }
+    }
+
+    eval { Qux->foo() };
+    is($@, '', "->next::can on non-existing package name");
+
 }