Set PL_stderrgv to NULL if it is freed.
authorNicholas Clark <nick@ccl4.org>
Thu, 28 Feb 2013 14:12:47 +0000 (15:12 +0100)
committerNicholas Clark <nick@ccl4.org>
Wed, 6 Mar 2013 09:03:13 +0000 (10:03 +0100)
Without this, it's possible to hit assertion failures when global destruction
attempts to skip the PVIO for PL_stderrgv while cleaning up all objects.

sv.c
t/op/stash.t

diff --git a/sv.c b/sv.c
index 727e283..09b180f 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -6257,6 +6257,8 @@ Perl_sv_clear(pTHX_ SV *const orig_sv)
                PL_last_in_gv = NULL;
            else if ((const GV *)sv == PL_statgv)
                PL_statgv = NULL;
+            else if ((const GV *)sv == PL_stderrgv)
+                PL_stderrgv = NULL;
        case SVt_PVMG:
        case SVt_PVNV:
        case SVt_PVIV:
index 616853b..fd5450e 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
 
 BEGIN { require "./test.pl"; }
 
-plan( tests => 57 );
+plan( tests => 58 );
 
 # Used to segfault (bug #15479)
 fresh_perl_like(
@@ -63,6 +63,13 @@ package main;
                  '',
                  '',
                  );
+    # Variant of the above which creates an object that persists until global
+    # destruction.
+    fresh_perl_is(
+                 'use Exporter; package A; sub a { // }; %::=""',
+                 '',
+                 '',
+                 );
 }
 
 # now tests in eval