From: Marcus Holland-Moritz Date: Fri, 18 Jul 2008 06:36:09 +0000 (+0000) Subject: Welcome to refcount hell. Fix the leaks reported by #57024 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=ec83ea38ebd7a9cbfbb0209243d3f52270074917;p=p5sagit%2Fp5-mst-13.2.git Welcome to refcount hell. Fix the leaks reported by #57024 along with a bunch other named capture related leaks. p4raw-id: //depot/perl@34151 --- diff --git a/regcomp.c b/regcomp.c index 73fce85..f461fea 100644 --- a/regcomp.c +++ b/regcomp.c @@ -4985,13 +4985,11 @@ Perl_reg_named_buff_fetch(pTHX_ REGEXP * const r, SV * const namesv, } 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 @@ Perl_reg_named_buff_scalar(pTHX_ REGEXP * const r, const U32 flags) 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 @@ Perl_reg_named_buff_all(pTHX_ REGEXP * const r, const U32 flags) } } - return newRV((SV*)av); + return newRV_noinc((SV*)av); } void diff --git a/universal.c b/universal.c index 84d13fc..be58760 100644 --- a/universal.c +++ b/universal.c @@ -1116,7 +1116,7 @@ XS(XS_re_regnames_count) SPAGAIN; if (ret) { - XPUSHs(ret); + mXPUSHs(ret); PUTBACK; return; } else { @@ -1150,10 +1150,7 @@ XS(XS_re_regname) 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 @@ XS(XS_re_regnames) 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 @@ XS(XS_Tie_Hash_NamedCapture_FETCH) SPAGAIN; if (ret) { - if (SvROK(ret)) - XPUSHs(ret); - else - XPUSHs(SvREFCNT_inc(ret)); + mXPUSHs(ret); PUTBACK; return; } @@ -1453,7 +1450,7 @@ XS(XS_Tie_Hash_NamedCapture_FIRSTK) SPAGAIN; if (ret) { - XPUSHs(SvREFCNT_inc(ret)); + mXPUSHs(ret); PUTBACK; } else { XSRETURN_UNDEF; @@ -1485,7 +1482,7 @@ XS(XS_Tie_Hash_NamedCapture_NEXTK) SPAGAIN; if (ret) { - XPUSHs(ret); + mXPUSHs(ret); } else { XSRETURN_UNDEF; } @@ -1516,7 +1513,7 @@ XS(XS_Tie_Hash_NamedCapture_SCALAR) SPAGAIN; if (ret) { - XPUSHs(ret); + mXPUSHs(ret); PUTBACK; return; } else {