From 5b7e07faf1ded956fab9b6778205fe47bfe1712c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppi...@redhat.com>
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                                          |  6 ++
 2 files changed, 100 insertions(+)
 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 <da...@iabyn.com>
+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 <da...@iabyn.com>
+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ř <ppi...@redhat.com>
+---
+ 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 1b8bc3d..d9e0c0c 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
 
@@ -2911,6 +2914,7 @@ Perl extension for Version Objects
 %patch58 -p1
 %patch59 -p1
 %patch60 -p1
+%patch61 -p1
 %patch200 -p1
 %patch201 -p1
 
@@ -2962,6 +2966,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}
@@ -5245,6 +5250,7 @@ popd
   (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 <ppi...@redhat.com> - 4:5.24.0-379
 - Tie perl-Errno release to interpreter build because of kernel version check
-- 
cgit v0.12


        
http://pkgs.fedoraproject.org/cgit/perl.git/commit/?h=f25&id=5b7e07faf1ded956fab9b6778205fe47bfe1712c
_______________________________________________
perl-devel mailing list -- perl-devel@lists.fedoraproject.org
To unsubscribe send an email to perl-devel-le...@lists.fedoraproject.org

Reply via email to