|
|
276c98 |
From e7acdfe976f01ee0d1ba31b3b1db61454a72d6c9 Mon Sep 17 00:00:00 2001
|
|
|
276c98 |
From: David Mitchell <davem@iabyn.com>
|
|
|
276c98 |
Date: Tue, 21 Jun 2016 17:06:52 +0100
|
|
|
276c98 |
Subject: [PATCH] only treat stash entries with .*:: as sub-stashes
|
|
|
276c98 |
MIME-Version: 1.0
|
|
|
276c98 |
Content-Type: text/plain; charset=UTF-8
|
|
|
276c98 |
Content-Transfer-Encoding: 8bit
|
|
|
276c98 |
|
|
|
276c98 |
RT #128238
|
|
|
276c98 |
|
|
|
276c98 |
%: = 0 would cause an assertion failure in Perl_gv_check(), since when
|
|
|
276c98 |
it searched a stash for substashes, it assumed anything ending in ':' was
|
|
|
276c98 |
a substash, whereas substashes end in '::'. So check for a double colon
|
|
|
276c98 |
before recursing.
|
|
|
276c98 |
|
|
|
276c98 |
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
|
276c98 |
---
|
|
|
276c98 |
gv.c | 5 ++++-
|
|
|
276c98 |
t/op/stash.t | 9 ++++++++-
|
|
|
276c98 |
2 files changed, 12 insertions(+), 2 deletions(-)
|
|
|
276c98 |
|
|
|
276c98 |
diff --git a/gv.c b/gv.c
|
|
|
276c98 |
index 4df3bce..2b3bdfa 100644
|
|
|
276c98 |
--- a/gv.c
|
|
|
276c98 |
+++ b/gv.c
|
|
|
276c98 |
@@ -2423,7 +2423,10 @@ Perl_gv_check(pTHX_ HV *stash)
|
|
|
276c98 |
for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
|
|
|
276c98 |
GV *gv;
|
|
|
276c98 |
HV *hv;
|
|
|
276c98 |
- if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
|
|
|
276c98 |
+ STRLEN keylen = HeKLEN(entry);
|
|
|
276c98 |
+ const char * const key = HeKEY(entry);
|
|
|
276c98 |
+
|
|
|
276c98 |
+ if (keylen >= 2 && key[keylen-2] == ':' && key[keylen-1] == ':' &&
|
|
|
276c98 |
(gv = MUTABLE_GV(HeVAL(entry))) && isGV(gv) && (hv = GvHV(gv)))
|
|
|
276c98 |
{
|
|
|
276c98 |
if (hv != PL_defstash && hv != stash
|
|
|
276c98 |
diff --git a/t/op/stash.t b/t/op/stash.t
|
|
|
276c98 |
index b8e0f34..ec795a9 100644
|
|
|
276c98 |
--- a/t/op/stash.t
|
|
|
276c98 |
+++ b/t/op/stash.t
|
|
|
276c98 |
@@ -7,7 +7,7 @@ BEGIN {
|
|
|
276c98 |
|
|
|
276c98 |
BEGIN { require "./test.pl"; }
|
|
|
276c98 |
|
|
|
276c98 |
-plan( tests => 52 );
|
|
|
276c98 |
+plan( tests => 53 );
|
|
|
276c98 |
|
|
|
276c98 |
# Used to segfault (bug #15479)
|
|
|
276c98 |
fresh_perl_like(
|
|
|
276c98 |
@@ -341,3 +341,10 @@ is runperl(
|
|
|
276c98 |
),
|
|
|
276c98 |
"ok\n",
|
|
|
276c98 |
'[perl #128086] no crash from assigning hash to *:::::: & deleting it';
|
|
|
276c98 |
+
|
|
|
276c98 |
+is runperl(
|
|
|
276c98 |
+ prog => 'BEGIN { %: = 0; $^W=1}; print qq|ok\n|',
|
|
|
276c98 |
+ stderr => 1,
|
|
|
276c98 |
+ ),
|
|
|
276c98 |
+ "ok\n",
|
|
|
276c98 |
+ "[perl #128238] don't treat %: as a stash (needs 2 colons)"
|
|
|
276c98 |
--
|
|
|
276c98 |
2.5.5
|
|
|
276c98 |
|