diff options
author | ilmari@vesla.ilmari.org <ilmari@vesla.ilmari.org> | 2008-02-21 12:29:42 -0800 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2008-02-25 10:54:47 +0000 |
commit | 5fa9f95182cd3e9dfed1f750408ef8b876d6a9c6 (patch) | |
tree | 1961dd4cd8e5949748a8b20f7e77cd4639474bcc | |
parent | 0a3a8dc0cd7227e83cd26fe236d1ad57c4add668 (diff) | |
download | perl-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.c | 2 | ||||
-rw-r--r-- | t/mro/next_edgecases.t | 15 |
2 files changed, 14 insertions, 3 deletions
@@ -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"); + } |