Change 34151 by [EMAIL PROTECTED] on 2008/07/18 06:36:09

        Welcome to refcount hell. Fix the leaks reported by #57024
        along with a bunch other named capture related leaks.

Affected files ...

... //depot/perl/regcomp.c#657 edit
... //depot/perl/universal.c#192 edit

Differences ...

==== //depot/perl/regcomp.c#657 (text) ====
Index: perl/regcomp.c
--- perl/regcomp.c#656~34039~   2008-06-09 11:43:59.000000000 -0700
+++ perl/regcomp.c      2008-07-17 23:36:09.000000000 -0700
@@ -4985,13 +4985,11 @@
                 } else {
                     ret = newSVsv(&PL_sv_undef);
                 }
-                if (retarray) {
-                    SvREFCNT_inc_simple_void(ret);
+                if (retarray)
                     av_push(retarray, ret);
-                }
             }
             if (retarray)
-                return newRV((SV*)retarray);
+                return newRV_noinc((SV*)retarray);
         }
     }
     return NULL;
@@ -5088,6 +5086,7 @@
             ret = CALLREG_NAMED_BUFF_ALL(r, (flags | RXapif_REGNAMES));
             av = (AV*)SvRV(ret);
             length = av_len(av);
+           SvREFCNT_dec(ret);
             return newSViv(length + 1);
         } else {
             Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_scalar", 
(int)flags);
@@ -5129,7 +5128,7 @@
         }
     }
 
-    return newRV((SV*)av);
+    return newRV_noinc((SV*)av);
 }
 
 void

==== //depot/perl/universal.c#192 (text) ====
Index: perl/universal.c
--- perl/universal.c#191~33910~ 2008-05-22 23:15:37.000000000 -0700
+++ perl/universal.c    2008-07-17 23:36:09.000000000 -0700
@@ -1116,7 +1116,7 @@
     SPAGAIN;
 
     if (ret) {
-        XPUSHs(ret);
+        mXPUSHs(ret);
         PUTBACK;
         return;
     } else {
@@ -1150,10 +1150,7 @@
     ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
 
     if (ret) {
-        if (SvROK(ret))
-            XPUSHs(ret);
-        else
-            XPUSHs(SvREFCNT_inc(ret));
+        mXPUSHs(ret);
         XSRETURN(1);
     }
     XSRETURN_UNDEF;    
@@ -1206,8 +1203,11 @@
         if (!entry)
             Perl_croak(aTHX_ "NULL array element in re::regnames()");
 
-        XPUSHs(*entry);
+        mXPUSHs(SvREFCNT_inc_simple_NN(*entry));
     }
+
+    SvREFCNT_dec(ret);
+
     PUTBACK;
     return;
 }
@@ -1326,10 +1326,7 @@
     SPAGAIN;
 
     if (ret) {
-        if (SvROK(ret))
-            XPUSHs(ret);
-        else
-            XPUSHs(SvREFCNT_inc(ret));
+        mXPUSHs(ret);
         PUTBACK;
         return;
     }
@@ -1453,7 +1450,7 @@
     SPAGAIN;
 
     if (ret) {
-        XPUSHs(SvREFCNT_inc(ret));
+        mXPUSHs(ret);
         PUTBACK;
     } else {
         XSRETURN_UNDEF;
@@ -1485,7 +1482,7 @@
     SPAGAIN;
 
     if (ret) {
-        XPUSHs(ret);
+        mXPUSHs(ret);
     } else {
         XSRETURN_UNDEF;
     }  
@@ -1516,7 +1513,7 @@
     SPAGAIN;
 
     if (ret) {
-        XPUSHs(ret);
+        mXPUSHs(ret);
         PUTBACK;
         return;
     } else {
End of Patch.

Reply via email to