summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorilmari@vesla.ilmari.org <ilmari@vesla.ilmari.org>2008-02-21 12:29:42 -0800
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2008-02-25 10:54:47 +0000
commit5fa9f95182cd3e9dfed1f750408ef8b876d6a9c6 (patch)
tree1961dd4cd8e5949748a8b20f7e77cd4639474bcc
parent0a3a8dc0cd7227e83cd26fe236d1ad57c4add668 (diff)
downloadperl-5fa9f95182cd3e9dfed1f750408ef8b876d6a9c6.tar.gz
Avoid a segfault case in MRO code, based on :
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
-rw-r--r--mro.c2
-rw-r--r--t/mro/next_edgecases.t15
2 files changed, 14 insertions, 3 deletions
diff --git a/mro.c b/mro.c
index 83872dc50a..2d52805826 100644
--- 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);
diff --git a/t/mro/next_edgecases.t b/t/mro/next_edgecases.t
index 91c2c8581b..ff3272dc60 100644
--- a/t/mro/next_edgecases.t
+++ b/t/mro/next_edgecases.t
@@ -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");
+
}