You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.8 KiB
54 lines
1.8 KiB
From ab307de390c3459badcc89b3d77542b5b871b2e8 Mon Sep 17 00:00:00 2001 |
|
From: Richard Leach <richardleach@users.noreply.github.com> |
|
Date: Tue, 20 Oct 2020 18:16:38 +0100 |
|
Subject: [PATCH 2/2] pp_split: add TonyC's stack-not-refcounted-suggestion and |
|
tests |
|
MIME-Version: 1.0 |
|
Content-Type: text/plain; charset=UTF-8 |
|
Content-Transfer-Encoding: 8bit |
|
|
|
Signed-off-by: Petr Písař <ppisar@redhat.com> |
|
--- |
|
pp.c | 5 ++++- |
|
t/op/split.t | 5 +++++ |
|
2 files changed, 9 insertions(+), 1 deletion(-) |
|
|
|
diff --git a/pp.c b/pp.c |
|
index ce16c56e63..5b5e163011 100644 |
|
--- a/pp.c |
|
+++ b/pp.c |
|
@@ -6034,6 +6034,9 @@ PP(pp_split) |
|
oldsave = PL_savestack_ix; |
|
} |
|
|
|
+ /* Some defence against stack-not-refcounted bugs */ |
|
+ (void)sv_2mortal(SvREFCNT_inc_simple_NN(ary)); |
|
+ |
|
if ((mg = SvTIED_mg((const SV *)ary, PERL_MAGIC_tied))) { |
|
PUSHMARK(SP); |
|
XPUSHs(SvTIED_obj(MUTABLE_SV(ary), mg)); |
|
@@ -6356,7 +6359,7 @@ PP(pp_split) |
|
} |
|
|
|
PUTBACK; |
|
- LEAVE_SCOPE(oldsave); /* may undo an earlier SWITCHSTACK */ |
|
+ LEAVE_SCOPE(oldsave); |
|
SPAGAIN; |
|
if (realarray) { |
|
if (!mg) { |
|
diff --git a/t/op/split.t b/t/op/split.t |
|
index 1d78a45bde..7a321645ac 100644 |
|
--- a/t/op/split.t |
|
+++ b/t/op/split.t |
|
@@ -703,3 +703,8 @@ fresh_perl_is('my @ary; @ary = split(/\w(?{ @ary[1000] = 1 })/, "abc");', |
|
fresh_perl_is('my @ary; @ary = split(/\w(?{ undef @ary })/, "abc");', |
|
'',{},'(@ary = split ...) survives an (undef @ary)'); |
|
|
|
+# check the (@ary = split) optimisation survives stack-not-refcounted bugs |
|
+fresh_perl_is('our @ary; @ary = split(/\w(?{ *ary = 0 })/, "abc");', |
|
+ '',{},'(@ary = split ...) survives @ary destruction via typeglob'); |
|
+fresh_perl_is('my $ary = []; @$ary = split(/\w(?{ $ary = [] })/, "abc");', |
|
+ '',{},'(@ary = split ...) survives @ary destruction via reassignment'); |
|
-- |
|
2.25.4 |
|
|
|
|