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.

Reply via email to