From fc0fe26a7d286480c1bb25f57e469ece575bb68d Mon Sep 17 00:00:00 2001 From: David Mitchell Date: Thu, 7 Jul 2016 17:03:29 +0100 Subject: [PATCH] SEGV in "Subroutine redefined" warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RT #128257 The following SEGVed: sub P::f{} undef *P::; *P::f =sub{}; due to the code which generates the "Subroutine STASH::NAME redefined" warning assuming that the GV always has a stash. Make it so that if it hasn't, the message changes to "Subroutine NAME redefined" rather than just crashing. Signed-off-by: Petr Písař --- sv.c | 18 +++++++++++------- t/lib/warnings/sv | 8 ++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/sv.c b/sv.c index 1b7a283..0cbe371 100644 --- a/sv.c +++ b/sv.c @@ -4074,14 +4074,18 @@ Perl_gv_setref(pTHX_ SV *const dstr, SV *const sstr) CvCONST((const CV *)sref) ? cv_const_sv((const CV *)sref) : NULL; + HV * const stash = GvSTASH((const GV *)dstr); report_redefined_cv( - sv_2mortal(Perl_newSVpvf(aTHX_ - "%"HEKf"::%"HEKf, - HEKfARG( - HvNAME_HEK(GvSTASH((const GV *)dstr)) - ), - HEKfARG(GvENAME_HEK(MUTABLE_GV(dstr))) - )), + sv_2mortal( + stash + ? Perl_newSVpvf(aTHX_ + "%"HEKf"::%"HEKf, + HEKfARG(HvNAME_HEK(stash)), + HEKfARG(GvENAME_HEK(MUTABLE_GV(dstr)))) + : Perl_newSVpvf(aTHX_ + "%"HEKf, + HEKfARG(GvENAME_HEK(MUTABLE_GV(dstr)))) + ), cv, CvCONST((const CV *)sref) ? &new_const_sv : NULL ); diff --git a/t/lib/warnings/sv b/t/lib/warnings/sv index 5ddd4fe..c8e0e62 100644 --- a/t/lib/warnings/sv +++ b/t/lib/warnings/sv @@ -413,3 +413,11 @@ Argument "a_c" isn't numeric in preincrement (++) at - line 5. Argument "(?^:abc)" isn't numeric in preincrement (++) at - line 6. Argument "123x" isn't numeric in preincrement (++) at - line 7. Argument "123e" isn't numeric in preincrement (++) at - line 8. +######## +# RT #128257 This used to SEGV +use warnings; +sub Foo::f {} +undef *Foo::; +*Foo::f =sub {}; +EXPECT +Subroutine f redefined at - line 5. -- 2.5.5