77 lines
2.3 KiB
Diff
77 lines
2.3 KiB
Diff
From fc0fe26a7d286480c1bb25f57e469ece575bb68d Mon Sep 17 00:00:00 2001
|
|
From: David Mitchell <davem@iabyn.com>
|
|
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ř <ppisar@redhat.com>
|
|
---
|
|
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
|
|
|