Subject: | New pad corruption with threaded perls >= 5.21.5 |
We're seeing spectacular test failures in Kavorka and Moops with Perl 5.22.1.
https://rt.cpan.org/Ticket/Display.html?id=110619
https://rt.cpan.org/Ticket/Display.html?id=109841
I've traced these down to a 5.22 regression in Devel-CallParser, as seen in the attached test case (t.pl). It looks like just using Devel::CallParser can result in a {my $var} block clobbering an existing $var.
This bisects to perl commit v5.21.3-186-gc9859fb
http://perl5.git.perl.org/perl.git/commit/c9859fbde1acd1489395f240f10a2a5f5eec48ea
and only happens on threaded perls.
The point of corruption is the av_fill(PL_comppad, padfill) call in CallParser.xs; apparently the workaround for #88341 (pad corruption on 5.18) is now harmful. The reason it was left in appears to be fixed in 5.19.5 according to http://www.nntp.perl.org/group/perl.perl5.porters/2013/09/msg208032.html so perhaps it could be disabled for newer perls? See the attached patch.
I've tested that things work with this on 5.20.2 and 5.22.1.
Thanks for your work,
--
Niko Tyni
ntyni@debian.org
Subject: | 0001-Fix-a-pad-problem-with-Perl-5.21.4-on-threaded-build.patch |
From ba92f4cba247c91d100e05f2b83dd093055e462b Mon Sep 17 00:00:00 2001
From: Niko Tyni <ntyni@debian.org>
Date: Fri, 25 Dec 2015 18:53:08 +0200
Subject: [PATCH] Fix a pad problem with Perl >= 5.21.4 on threaded builds
This broke at least the Kavorka and Moops distributions.
Bug-Debian: https://bugs.debian.org/808826
---
lib/Devel/CallParser.xs | 10 +++++++---
t/pad2.t | 15 +++++++++++++++
2 files changed, 22 insertions(+), 3 deletions(-)
create mode 100644 t/pad2.t
diff --git a/lib/Devel/CallParser.xs b/lib/Devel/CallParser.xs
index 6643739..847742c 100644
--- a/lib/Devel/CallParser.xs
+++ b/lib/Devel/CallParser.xs
@@ -323,10 +323,14 @@ static int my_keyword_plugin(pTHX_
* The core bug was supposedly fixed in Perl 5.19.4, but actually
* that version exhibits a different bug also apparently related
* to padrange. Restoring the pad's fill pointer works around
- * this bug too. So for now this workaround is used with no
- * upper bound on the Perl version.
+ * this bug too.
+ *
+ * The other padrange bug was fixed in Perl 5.19.5 (commit aa033da),
+ * so the workaround is no longer needed after that, but it remains
+ * harmless until v5.21.4 (commit c9859fb) where it starts breaking
+ * (see t/pad2.t.)
*/
-#define MUST_RESTORE_PAD_FILL PERL_VERSION_GE(5,17,6)
+#define MUST_RESTORE_PAD_FILL PERL_VERSION_GE(5,17,6) && ! PERL_VERSION_GE(5,19,5)
#if MUST_RESTORE_PAD_FILL
I32 padfill = av_len(PL_comppad);
#endif /* MUST_RESTORE_PAD_FILL */
diff --git a/t/pad2.t b/t/pad2.t
new file mode 100644
index 0000000..92c6dab
--- /dev/null
+++ b/t/pad2.t
@@ -0,0 +1,15 @@
+use warnings;
+use strict;
+
+use Test::More tests => 1;
+
+use Devel::CallParser;
+
+sub f {
+ my $arg = shift;
+
+ { my $arg; } # ???
+ ok($arg, '$arg stays set after a "my $arg" block');
+}
+
+f(1);
--
2.6.4
Subject: | t.pl |
#!/usr/bin/perl -w
use Devel::CallParser;
sub f {
my $arg = shift;
{ my $arg; } # ???
print $arg ? "ok\n" : "not ok\n";
}
f(1);