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.