Change 30166 by [EMAIL PROTECTED] on 2007/02/07 22:59:15
Integrate:
[ 26027]
Subject: [perl #24254] Attempt to free unreferenced scalar
From: "Chris Heath via RT" <[EMAIL PROTECTED]>
Date: Sun, 06 Nov 2005 20:08:05 -0800
Message-ID: <[EMAIL PROTECTED]>
[ 26043]
Subject: Re: C<undef %::> considered harmful
From: Benjamin Sugars <[EMAIL PROTECTED]>
Date: Fri, 20 Apr 2001 10:30:20 -0400 (EDT)
Message-ID: <[EMAIL PROTECTED]>
except the part that increases the refcount of PL_stderrgv, already
fixed separately.
[ 26192]
Subject: Re: [PATCH] concat interacts badly with magic
From: Robin Houston <[EMAIL PROTECTED]>
Date: Tue, 22 Nov 2005 14:07:27 +0000
Message-ID: <[EMAIL PROTECTED]>
(new version of patch for bug #37722)
[ 26643]
Fix some compilation warnings
Affected files ...
... //depot/maint-5.8/perl/cop.h#34 integrate
... //depot/maint-5.8/perl/perl.c#202 integrate
... //depot/maint-5.8/perl/pp_hot.c#128 integrate
... //depot/maint-5.8/perl/t/lib/warnings/pp_hot#3 integrate
... //depot/maint-5.8/perl/t/op/tie.t#17 integrate
Differences ...
==== //depot/maint-5.8/perl/cop.h#34 (text) ====
Index: perl/cop.h
--- perl/cop.h#33~30127~ 2007-02-05 03:57:18.000000000 -0800
+++ perl/cop.h 2007-02-07 14:59:15.000000000 -0800
@@ -499,9 +499,14 @@
#define POPLOOP(cx) \
SvREFCNT_dec(cx->blk_loop.iterlval); \
if (CxITERVAR(cx)) { \
- SV ** const s_v_p = CxITERVAR(cx); \
- sv_2mortal(*s_v_p); \
- *s_v_p = cx->blk_loop.itersave; \
+ if (SvPADMY(cx->blk_loop.itersave)) { \
+ SV ** const s_v_p = CxITERVAR(cx); \
+ sv_2mortal(*s_v_p); \
+ *s_v_p = cx->blk_loop.itersave; \
+ } \
+ else { \
+ SvREFCNT_dec(cx->blk_loop.itersave); \
+ } \
} \
if (cx->blk_loop.iterary && cx->blk_loop.iterary != PL_curstack)\
SvREFCNT_dec(cx->blk_loop.iterary);
==== //depot/maint-5.8/perl/perl.c#202 (text) ====
Index: perl/perl.c
--- perl/perl.c#201~30121~ 2007-02-04 13:32:10.000000000 -0800
+++ perl/perl.c 2007-02-07 14:59:15.000000000 -0800
@@ -3609,11 +3609,14 @@
SvREADONLY_on(gv);
PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpvs("INC", GV_ADD|GV_NOTQUAL,
SVt_PVAV)));
+ SvREFCNT_inc(PL_incgv); /* Don't allow it to be freed */
GvMULTI_on(PL_incgv);
PL_hintgv = gv_fetchpvs("\010", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^H */
GvMULTI_on(PL_hintgv);
PL_defgv = gv_fetchpvs("_", GV_ADD|GV_NOTQUAL, SVt_PVAV);
+ SvREFCNT_inc(PL_defgv);
PL_errgv = gv_HVadd(gv_fetchpvs("@", GV_ADD|GV_NOTQUAL, SVt_PV));
+ SvREFCNT_inc(PL_errgv);
GvMULTI_on(PL_errgv);
PL_replgv = gv_fetchpvs("\022", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^R */
GvMULTI_on(PL_replgv);
==== //depot/maint-5.8/perl/pp_hot.c#128 (text) ====
Index: perl/pp_hot.c
--- perl/pp_hot.c#127~30075~ 2007-01-29 15:16:13.000000000 -0800
+++ perl/pp_hot.c 2007-02-07 14:59:15.000000000 -0800
@@ -209,11 +209,14 @@
dPOPTOPssrl;
bool lbyte;
STRLEN rlen;
- const char *rpv = SvPV_const(right, rlen); /* mg_get(right) happens here */
- const bool rbyte = !DO_UTF8(right);
+ const char *rpv = 0;
+ bool rbyte = FALSE;
bool rcopied = FALSE;
if (TARG == right && right != left) {
+ /* mg_get(right) may happen here ... */
+ rpv = SvPV_const(right, rlen);
+ rbyte = !DO_UTF8(right);
right = sv_2mortal(newSVpvn(rpv, rlen));
rpv = SvPV_const(right, rlen); /* no point setting UTF-8 here */
rcopied = TRUE;
@@ -232,14 +235,22 @@
else { /* TARG == left */
STRLEN llen;
SvGETMAGIC(left); /* or mg_get(left) may happen here */
- if (!SvOK(TARG))
+ if (!SvOK(TARG)) {
+ if (left == right && ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
sv_setpvn(left, "", 0);
+ }
(void)SvPV_nomg_const(left, llen); /* Needed to set UTF8 flag */
lbyte = !DO_UTF8(left);
if (IN_BYTES)
SvUTF8_off(TARG);
}
+ /* or mg_get(right) may happen here */
+ if (!rcopied) {
+ rpv = SvPV_const(right, rlen);
+ rbyte = !DO_UTF8(right);
+ }
#if defined(PERL_Y2KWARN)
if ((SvIOK(right) || SvNOK(right)) && ckWARN(WARN_Y2K) && SvOK(TARG)) {
if (llen >= 2 && lpv[llen - 2] == '1' && lpv[llen - 1] == '9'
==== //depot/maint-5.8/perl/t/op/tie.t#17 (xtext) ====
Index: perl/t/op/tie.t
--- perl/t/op/tie.t#16~30026~ 2007-01-27 03:02:43.000000000 -0800
+++ perl/t/op/tie.t 2007-02-07 14:59:15.000000000 -0800
@@ -548,6 +548,13 @@
EXPECT
3.3
########
+sub TIESCALAR { bless {} }
+sub FETCH { shift()->{i} ++ }
+tie $h, "main";
+print $h.$h;
+EXPECT
+01
+########
# Bug 37731
sub foo::TIESCALAR { bless {value => $_[1]}, $_[0] }
sub foo::FETCH { $_[0]->{value} }
End of Patch.