From 8fcd2745c822fdad4b95f0e2ea61c3af00e0ca6d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <[email protected]>
Date: Thu, 1 Dec 2016 07:52:54 +0100
Subject: Fix assigning split() return values to an array

---
 ...s-leaving-PL_sv_undef-in-unused-ary-slots.patch | 94 ++++++++++++++++++++++
 perl.spec                                          |  8 +-
 2 files changed, 101 insertions(+), 1 deletion(-)
 create mode 100644 
perl-5.24.0-split-was-leaving-PL_sv_undef-in-unused-ary-slots.patch

diff --git 
a/perl-5.24.0-split-was-leaving-PL_sv_undef-in-unused-ary-slots.patch 
b/perl-5.24.0-split-was-leaving-PL_sv_undef-in-unused-ary-slots.patch
new file mode 100644
index 0000000..7f9de6d
--- /dev/null
+++ b/perl-5.24.0-split-was-leaving-PL_sv_undef-in-unused-ary-slots.patch
@@ -0,0 +1,94 @@
+From 27a8a9e2a55ccc148582006396a9c35bafa5f0b3 Mon Sep 17 00:00:00 2001
+From: David Mitchell <[email protected]>
+Date: Wed, 30 Nov 2016 08:59:01 +0000
+Subject: [PATCH] split was leaving PL_sv_undef in unused ary slots
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Petr Pisar: Ported to 5.24.0:
+
+commit 71ca73e5fa9639ac33e9f2e74cd0c32288a5040d
+Author: David Mitchell <[email protected]>
+Date:   Wed Nov 30 08:59:01 2016 +0000
+
+    split was leaving PL_sv_undef in unused ary slots
+
+    This:
+
+        @a = split(/-/,"-");
+        $a[1] = undef;
+        $a[0] = 0;
+
+    was giving
+
+        Modification of a read-only value attempted at foo line 3.
+
+    This is because:
+
+    1) unused slots in AvARRAY between AvFILL and AvMAX should always be
+    null; av_clear(), av_extend() etc do this; while av_store(), if storing
+    to a slot N somewhere between AvFILL and AvMAX, doesn't bother to clear
+    between (AvFILL+1)..(N-1) on the assumption that everyone else plays
+    nicely.
+
+    2) pp_split() when splitting directly to an array, sometimes over-splits
+    and has to null out the excess elements;
+
+    3) Since perl 5.19.4, unused AV slots are now marked with NULL rather than
+    &PL_sv_undef;
+
+    4) pp_split was still using &PL_sv_undef;
+
+    The fault was with (4), and is easily fixed.
+
+Signed-off-by: Petr Písař <[email protected]>
+---
+ pp.c         |  2 +-
+ t/op/split.t | 13 ++++++++++++-
+ 2 files changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/pp.c b/pp.c
+index 4153482..70345ce 100644
+--- a/pp.c
++++ b/pp.c
+@@ -6212,7 +6212,7 @@ PP(pp_split)
+           while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) {
+               if (TOPs && !make_mortal)
+                   sv_2mortal(TOPs);
+-              *SP-- = &PL_sv_undef;
++              *SP-- = NULL;
+               iters--;
+           }
+       }
+diff --git a/t/op/split.t b/t/op/split.t
+index fb73271..b7846a1 100644
+--- a/t/op/split.t
++++ b/t/op/split.t
+@@ -7,7 +7,7 @@ BEGIN {
+     set_up_inc('../lib');
+ }
+ 
+-plan tests => 131;
++plan tests => 133;
+ 
+ $FS = ':';
+ 
+@@ -523,3 +523,14 @@ is "@a", '1 2 3', 'assignment to split-to-array 
(pmtarget/package array)';
+ }
+ (@{\@a} = split //, "abc") = 1..10;
+ is "@a", '1 2 3', 'assignment to split-to-array (stacked)';
++
++# splitting directly to an array wasn't filling unused AvARRAY slots with
++# NULL
++
++{
++    my @a;
++    @a = split(/-/,"-");
++    $a[1] = 'b';
++    ok eval { $a[0] = 'a'; 1; }, "array split filling AvARRAY: assign 0";
++    is "@a", "a b", "array split filling AvARRAY: result";
++}
+-- 
+2.7.4
+
diff --git a/perl.spec b/perl.spec
index a47eacc..f4ef603 100644
--- a/perl.spec
+++ b/perl.spec
@@ -227,6 +227,9 @@ Patch59:        perl-5.25.7-Fix-Storable-segfaults.patch
 # in upstream after 5.25.7
 Patch60:        perl-5.24.0-crash-on-explicit-return-from-s-e.patch
 
+# Fix assigning split() return values to an array, in upstream after 5.25.7
+Patch61:        
perl-5.24.0-split-was-leaving-PL_sv_undef-in-unused-ary-slots.patch
+
 # Link XS modules to libperl.so with EU::CBuilder on Linux, bug #960048
 Patch200:       
perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-CBuilder-on-Li.patch
 
@@ -2913,6 +2916,7 @@ Perl extension for Version Objects
 %patch58 -p1
 %patch59 -p1
 %patch60 -p1
+%patch61 -p1
 %patch200 -p1
 %patch201 -p1
 
@@ -2964,6 +2968,7 @@ perl -x patchlevel.h \
     'Fedora Patch58: Fix stack handling when calling chdir without an argument 
(RT#129130)' \
     'Fedora Patch59: Fix crash in Storable when deserializing malformed code 
reference (RT#68348, RT#130098)' \
     'Fedora Patch60: Fix crash on explicit return from regular expression 
substitution (RT#130188)' \
+    'Fedora Patch61: Fix assigning split() return values to an array' \
     'Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on 
Linux' \
     'Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux' \
     %{nil}
@@ -5242,11 +5247,12 @@ popd
 
 # Old changelog entries are preserved in CVS.
 %changelog
-* Mon Nov 28 2016 Petr Pisar <[email protected]> - 4:5.24.0-381
+* Thu Dec 01 2016 Petr Pisar <[email protected]> - 4:5.24.0-381
 - Fix crash in Storable when deserializing malformed code reference
   (RT#68348, RT#130098)
 - Fix crash on explicit return from regular expression substitution (RT#130188)
 - Tighten dependencies between architecture specific sub-packages to ISA
+- Fix assigning split() return values to an array
 
 * Wed Nov 09 2016 Petr Pisar <[email protected]> - 4:5.24.0-380
 - Tie perl-Errno release to interpreter build because of kernel version check
-- 
cgit v0.12


        
http://pkgs.fedoraproject.org/cgit/perl.git/commit/?h=master&id=8fcd2745c822fdad4b95f0e2ea61c3af00e0ca6d
_______________________________________________
perl-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to