summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Mitchell <davem@fdisolutions.com>2003-10-23 19:13:20 +0000
committerDave Mitchell <davem@fdisolutions.com>2003-10-23 19:13:20 +0000
commitff893b5b74923e0a02bed52330ab95ba0d9749f4 (patch)
tree6cf31a4e5ef7425869aeeadb07068bb0538ebda3
parenteab9b6a225912b3bc8e071a6a42d75fe9b54dde5 (diff)
downloadperl-ff893b5b74923e0a02bed52330ab95ba0d9749f4.tar.gz
Fix two threads::shared leaks
#24061 - AV in shared interpreter wasn't set to AvREAL #24255 - mortals were added to the shared interpreter's tmpstack and never freed. p4raw-id: //depot/perl@21527
-rw-r--r--ext/threads/shared/shared.xs10
1 files changed, 10 insertions, 0 deletions
diff --git a/ext/threads/shared/shared.xs b/ext/threads/shared/shared.xs
index b19da1e6f2..52f54bee69 100644
--- a/ext/threads/shared/shared.xs
+++ b/ext/threads/shared/shared.xs
@@ -308,6 +308,8 @@ Perl_sharedsv_associate(pTHX_ SV **psv, SV *ssv, shared_sv *data)
if (sv && SvTYPE(ssv) < SvTYPE(sv)) {
SHARED_CONTEXT;
sv_upgrade(ssv, SvTYPE(*psv));
+ if (SvTYPE(ssv) == SVt_PVAV) /* #24061 */
+ AvREAL_on(ssv);
CALLER_CONTEXT;
}
@@ -436,6 +438,12 @@ sharedsv_scalar_store(pTHX_ SV *sv, shared_sv *shared)
if (target) {
SV *tmp;
SHARED_CONTEXT;
+ /* #24255: sv_setsv() (via sv_unref_flags()) may cause a
+ * deferred free with sv_2mortal(). Ensure that the free_tmps
+ * is done within this inpterpreter. DAPM.
+ */
+ ENTER;
+ SAVETMPS;
tmp = newRV(SHAREDSvPTR(target));
sv_setsv_nomg(SHAREDSvPTR(shared), tmp);
SvREFCNT_dec(tmp);
@@ -444,6 +452,8 @@ sharedsv_scalar_store(pTHX_ SV *sv, shared_sv *shared)
SvOBJECT_on(SHAREDSvPTR(target));
SvSTASH(SHAREDSvPTR(target)) = (HV*)fake_stash;
}
+ FREETMPS;
+ LEAVE;
CALLER_CONTEXT;
}
else {