Change 20292 by [EMAIL PROTECTED] on 2003/07/29 10:14:26 Most importantly, don't try HvNAME(gp->gp_hv) unless PL_stashcache exists, otherwise we get an invalid read (detected by valgrind, and crashes ext/threads/t/basic.t in Windows). Also add a few if:s for the refcnt decrements, no need to call Perl_sv_free() if there's nothing to free.
Affected files ... ... //depot/perl/gv.c#194 edit Differences ... ==== //depot/perl/gv.c#194 (text) ==== Index: perl/gv.c --- perl/gv.c#193~19794~ Sun Jun 15 14:01:18 2003 +++ perl/gv.c Tue Jul 29 03:14:26 2003 @@ -1252,14 +1252,18 @@ return; } - SvREFCNT_dec(gp->gp_sv); - SvREFCNT_dec(gp->gp_av); - if(gp->gp_hv && HvNAME(gp->gp_hv) && PL_stashcache) - hv_delete(PL_stashcache, HvNAME(gp->gp_hv), strlen(HvNAME(gp->gp_hv)), G_DISCARD); - SvREFCNT_dec(gp->gp_hv); - SvREFCNT_dec(gp->gp_io); - SvREFCNT_dec(gp->gp_cv); - SvREFCNT_dec(gp->gp_form); + if (gp->gp_sv) SvREFCNT_dec(gp->gp_sv); + if (gp->gp_sv) SvREFCNT_dec(gp->gp_av); + if (gp->gp_hv) { + if (PL_stashcache && HvNAME(gp->gp_hv)) + hv_delete(PL_stashcache, + HvNAME(gp->gp_hv), strlen(HvNAME(gp->gp_hv)), + G_DISCARD); + SvREFCNT_dec(gp->gp_hv); + } + if (gp->gp_io) SvREFCNT_dec(gp->gp_io); + if (gp->gp_cv) SvREFCNT_dec(gp->gp_cv); + if (gp->gp_form) SvREFCNT_dec(gp->gp_form); Safefree(gp); GvGP(gv) = 0; End of Patch.