pp_warn: use MEXTEND rather than EXTEND
authorDavid Mitchell <davem@iabyn.com>
Wed, 20 Dec 2017 13:07:46 +0000 (13:07 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 31 Jan 2018 18:26:18 +0000 (18:26 +0000)
RT #132602

pp_sys.c
t/op/warn.t

index 5154b9b..4ae475d 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -417,7 +417,7 @@ PP(pp_warn)
     }
     else if (SP == MARK) {
        exsv = &PL_sv_no;
-       EXTEND(SP, 1);
+       MEXTEND(SP, 1);
        SP = MARK + 1;
     }
     else {
index 42b88f8..0bf6967 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 
-plan 32;
+plan 33;
 
 my @warnings;
 my $wa = []; my $ea = [];
@@ -220,3 +220,22 @@ EOF
 }
 
 1;
+# RT #132602 pp_warn in scalar context was extending the stack then
+# setting SP back to the old, freed stack frame
+
+fresh_perl_is(<<'EOF', "OK\n", {stderr => 1}, "RT #132602");
+$SIG{__WARN__} = sub {};
+
+my (@a, @b);
+for my $i (1..300) {
+    push @a, $i;
+    () = (@a, warn);
+}
+
+# mess with the stack some more for ASan's benefit
+for my $i (1..100) {
+    push @a, $i;
+    @b = @a;
+}
+print "OK\n";
+EOF