Change 32937 by [EMAIL PROTECTED] on 2008/01/10 21:15:02

        Ensure DEBUG_LEAKING_SCALARS_ABORT can't be circumvented by fatal
        warnings. Add an abort() if you try to dup a freed scalar.

Affected files ...

... //depot/perl/sv.c#1482 edit

Differences ...

==== //depot/perl/sv.c#1482 (text) ====
Index: perl/sv.c
--- perl/sv.c#1481~32934~       2008-01-09 16:32:20.000000000 -0800
+++ perl/sv.c   2008-01-10 13:15:02.000000000 -0800
@@ -5424,15 +5424,23 @@
            return;
        }
        if (ckWARN_d(WARN_INTERNAL)) {
-           Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
-                        "Attempt to free unreferenced scalar: SV 0x%"UVxf
-                        pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
            Perl_dump_sv_child(aTHX_ sv);
 #else
   #ifdef DEBUG_LEAKING_SCALARS
-       sv_dump(sv);
+           sv_dump(sv);
   #endif
+#ifdef DEBUG_LEAKING_SCALARS_ABORT
+           if (PL_warnhook == PERL_WARNHOOK_FATAL
+               || ckDEAD(packWARN(WARN_INTERNAL))) {
+               /* Don't let Perl_warner cause us to escape our fate:  */
+               abort();
+           }
+#endif
+           /* This may not return:  */
+           Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
+                        "Attempt to free unreferenced scalar: SV 0x%"UVxf
+                        pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
 #endif
        }
 #ifdef DEBUG_LEAKING_SCALARS_ABORT
@@ -10138,8 +10146,14 @@
     dVAR;
     SV *dstr;
 
-    if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
+    if (!sstr)
        return NULL;
+    if (SvTYPE(sstr) == SVTYPEMASK) {
+#ifdef DEBUG_LEAKING_SCALARS_ABORT
+       abort();
+#endif
+       return NULL;
+    }
     /* look for it in the table first */
     dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
     if (dstr)
End of Patch.

Reply via email to