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.

Reply via email to