[ 21527]
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.
[oops. Also sucked in a typo correction in blead]
p4raw-link: @21527 on //depot/perl:
aa49c2f8cdfe618e292a459ac4668178f67243bd
p4raw-id: //depot/maint-5.8/perl@21530
p4raw-integrated: from //depot/perl@21527 'copy in'
ext/threads/shared/shared.xs (@21327..)
if (sv && SvTYPE(ssv) < SvTYPE(sv)) {
SHARED_CONTEXT;
sv_upgrade(ssv, SvTYPE(*psv));
+ if (SvTYPE(ssv) == SVt_PVAV) /* #24061 */
+ AvREAL_on(ssv);
CALLER_CONTEXT;
}
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);
SvOBJECT_on(SHAREDSvPTR(target));
SvSTASH(SHAREDSvPTR(target)) = (HV*)fake_stash;
}
+ FREETMPS;
+ LEAVE;
CALLER_CONTEXT;
}
else {