In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/fc0fe26a7d286480c1bb25f57e469ece575bb68d?hp=6fe82bd6d07db28c9792126ff851a29fe013401c>
- Log ----------------------------------------------------------------- commit fc0fe26a7d286480c1bb25f57e469ece575bb68d Author: David Mitchell <[email protected]> Date: Thu Jul 7 17:03:29 2016 +0100 SEGV in "Subroutine redefined" warning 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. ----------------------------------------------------------------------- Summary of changes: 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. -- Perl5 Master Repository
