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

Reply via email to