summaryrefslogtreecommitdiff
path: root/perl.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2013-10-27 16:44:50 -0700
committerFather Chrysostomos <sprout@cpan.org>2013-10-28 16:15:09 -0700
commit475b1e904edd8a988cfa0eaa8a1d302d545c54ac (patch)
tree61e917078baaed15ff599676640eb17417df0862 /perl.c
parent2be08ad105a2a12613bb690aae26e2a9d3b225f2 (diff)
downloadperl-475b1e904edd8a988cfa0eaa8a1d302d545c54ac.tar.gz
[perl #54044] Make PL_replgv refcounted
Otherwise one can free it and make perl crash: $ perl -e 'delete $::{"\cR"}; //' Segmentation fault: 11 It crashes because PL_replgv now points to a freed SV which has no GV slots, so GvSV on it fails.
Diffstat (limited to 'perl.c')
-rw-r--r--perl.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/perl.c b/perl.c
index 011b0a2697..8aa6a3f9f8 100644
--- a/perl.c
+++ b/perl.c
@@ -956,7 +956,6 @@ perl_destruct(pTHXx)
PL_stdingv = NULL;
PL_stderrgv = NULL;
PL_last_in_gv = NULL;
- PL_replgv = NULL;
PL_DBsingle = NULL;
PL_DBtrace = NULL;
PL_DBsignal = NULL;
@@ -966,11 +965,13 @@ perl_destruct(pTHXx)
SvREFCNT_dec(PL_envgv);
SvREFCNT_dec(PL_argvgv);
+ SvREFCNT_dec(PL_replgv);
SvREFCNT_dec(PL_DBgv);
SvREFCNT_dec(PL_DBline);
SvREFCNT_dec(PL_DBsub);
PL_envgv = NULL;
PL_argvgv = NULL;
+ PL_replgv = NULL;
PL_DBgv = NULL;
PL_DBline = NULL;
PL_DBsub = NULL;
@@ -3724,6 +3725,7 @@ S_init_main_stash(pTHX)
SvREFCNT_inc_simple_void(PL_errgv);
GvMULTI_on(PL_errgv);
PL_replgv = gv_fetchpvs("\022", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^R */
+ SvREFCNT_inc_simple_void(PL_replgv);
GvMULTI_on(PL_replgv);
(void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
#ifdef PERL_DONT_CREATE_GVSV