Change 34776 by [EMAIL PROTECTED] on 2008/11/08 12:38:36

        Assigning to DEFSV leaks if PL_defgv's gp_sv isn't set.
        As Nicholas already noted in a FIXME, assigning to DEFSV should
        use GvSV instead of GvSVn. This change ensures that, at least
        under -DPERL_CORE, DEFSV cannot be assigned to and introduces
        a DEFSV_set macro to allow setting DEFSV.
        This fixes #53038: map leaks memory.

Affected files ...

... //depot/perl/XSUB.h#127 edit
... //depot/perl/ext/Filter/Util/Call/Call.pm#13 edit
... //depot/perl/ext/Filter/Util/Call/Call.xs#11 edit
... //depot/perl/perl.h#843 edit
... //depot/perl/pp_ctl.c#709 edit
... //depot/perl/pp_hot.c#588 edit
... //depot/perl/regexec.c#579 edit

Differences ...

==== //depot/perl/XSUB.h#127 (text) ====
Index: perl/XSUB.h
--- perl/XSUB.h#126~34585~      2008-10-25 05:23:01.000000000 -0700
+++ perl/XSUB.h 2008-11-08 04:38:36.000000000 -0800
@@ -364,10 +364,10 @@
            SAVETMPS ;                                          \
            SAVEINT(db->filtering) ;                            \
            db->filtering = TRUE ;                              \
-           SAVESPTR(DEFSV) ;                                   \
+           SAVE_DEFSV ;                                        \
             if (name[7] == 's')                                 \
                 arg = newSVsv(arg);                             \
-           DEFSV = arg ;                                       \
+           DEFSV_set(arg) ;                                    \
            SvTEMP_off(arg) ;                                   \
            PUSHMARK(SP) ;                                      \
            PUTBACK ;                                           \

==== //depot/perl/ext/Filter/Util/Call/Call.pm#13 (text) ====
Index: perl/ext/Filter/Util/Call/Call.pm
--- perl/ext/Filter/Util/Call/Call.pm#12~33341~ 2008-02-21 09:53:05.000000000 
-0800
+++ perl/ext/Filter/Util/Call/Call.pm   2008-11-08 04:38:36.000000000 -0800
@@ -18,7 +18,7 @@
 
 @ISA = qw(Exporter DynaLoader);
 @EXPORT = qw( filter_add filter_del filter_read filter_read_exact) ;
-$VERSION = "1.07_01" ;
+$VERSION = "1.07_02" ;
 
 sub filter_read_exact($)
 {

==== //depot/perl/ext/Filter/Util/Call/Call.xs#11 (text) ====
Index: perl/ext/Filter/Util/Call/Call.xs
--- perl/ext/Filter/Util/Call/Call.xs#10~33341~ 2008-02-21 09:53:05.000000000 
-0800
+++ perl/ext/Filter/Util/Call/Call.xs   2008-11-08 04:38:36.000000000 -0800
@@ -125,9 +125,9 @@
            SAVEINT(current_idx) ;      /* save current idx */
            current_idx = idx ;
 
-           SAVESPTR(DEFSV) ;   /* save $_ */
+           SAVE_DEFSV ;        /* save $_ */
            /* make $_ use our buffer */
-           DEFSV = newSVpv("", 0) ; 
+           DEFSV_set(newSVpv("", 0)) ; 
 
            PUSHMARK(sp) ;
 

==== //depot/perl/perl.h#843 (text) ====
Index: perl/perl.h
--- perl/perl.h#842~34693~      2008-11-01 07:51:05.000000000 -0700
+++ perl/perl.h 2008-11-08 04:38:36.000000000 -0800
@@ -1306,8 +1306,12 @@
 #endif
 
 #define ERRSV GvSV(PL_errgv)
-/* FIXME? Change the assignments to PL_defgv to instantiate GvSV?  */
-#define DEFSV GvSVn(PL_defgv)
+#ifdef PERL_CORE
+# define DEFSV (0 + GvSVn(PL_defgv))
+#else
+# define DEFSV GvSVn(PL_defgv)
+#endif
+#define DEFSV_set(sv) (GvSV(PL_defgv) = (sv))
 #define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
 
 #define ERRHV GvHV(PL_errgv)   /* XXX unused, here for compatibility */

==== //depot/perl/pp_ctl.c#709 (text) ====
Index: perl/pp_ctl.c
--- perl/pp_ctl.c#708~34698~    2008-11-02 13:12:59.000000000 -0800
+++ perl/pp_ctl.c       2008-11-08 04:38:36.000000000 -0800
@@ -988,7 +988,7 @@
     if (PL_op->op_private & OPpGREP_LEX)
        PAD_SVl(PL_op->op_targ) = src;
     else
-       DEFSV = src;
+       DEFSV_set(src);
 
     PUTBACK;
     if (PL_op->op_type == OP_MAPSTART)
@@ -1099,7 +1099,7 @@
        if (PL_op->op_private & OPpGREP_LEX)
            PAD_SVl(PL_op->op_targ) = src;
        else
-           DEFSV = src;
+           DEFSV_set(src);
 
        RETURNOP(cLOGOP->op_other);
     }
@@ -4822,7 +4822,7 @@
        SAVETMPS;
        EXTEND(SP, 2);
 
-       DEFSV = upstream;
+       DEFSV_set(upstream);
        PUSHMARK(SP);
        mPUSHi(0);
        if (filter_state) {

==== //depot/perl/pp_hot.c#588 (text) ====
Index: perl/pp_hot.c
--- perl/pp_hot.c#587~34698~    2008-11-02 13:12:59.000000000 -0800
+++ perl/pp_hot.c       2008-11-08 04:38:36.000000000 -0800
@@ -2424,7 +2424,7 @@
        if (PL_op->op_private & OPpGREP_LEX)
            PAD_SVl(PL_op->op_targ) = src;
        else
-           DEFSV = src;
+           DEFSV_set(src);
 
        RETURNOP(cLOGOP->op_other);
     }

==== //depot/perl/regexec.c#579 (text) ====
Index: perl/regexec.c
--- perl/regexec.c#578~34770~   2008-11-07 14:33:39.000000000 -0800
+++ perl/regexec.c      2008-11-08 04:38:36.000000000 -0800
@@ -2250,7 +2250,7 @@
            /* Make $_ available to executed code. */
            if (reginfo->sv != DEFSV) {
                SAVE_DEFSV;
-               DEFSV = reginfo->sv;
+               DEFSV_set(reginfo->sv);
            }
        
            if (!(SvTYPE(reginfo->sv) >= SVt_PVMG && SvMAGIC(reginfo->sv)
End of Patch.

Reply via email to