From 104c40b089b35a27c011188bbe19b03f1150c54c Mon Sep 17 00:00:00 2001 From: Father Chrysostomos Date: Fri, 2 Nov 2012 06:12:27 -0700 Subject: [PATCH] =?utf8?q?Don=E2=80=99t=20leak=20when=20printfing=20to=20b?= =?utf8?q?ad=20handle=20under=20fatal=20warnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- pp_sys.c | 4 ++-- t/op/svleak.t | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/pp_sys.c b/pp_sys.c index bb82e32..82de0dd 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -1515,7 +1515,7 @@ PP(pp_prtf) { dVAR; dSP; dMARK; dORIGMARK; PerlIO *fp; - SV *sv; + SV *sv = NULL; GV * const gv = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv; @@ -1540,7 +1540,6 @@ PP(pp_prtf) } } - sv = newSV(0); if (!io) { report_evil_fh(gv); SETERRNO(EBADF,RMS_IFI); @@ -1555,6 +1554,7 @@ PP(pp_prtf) goto just_say_no; } else { + sv = newSV(0); do_sprintf(sv, SP - MARK, MARK + 1); if (!do_print(sv, fp)) goto just_say_no; diff --git a/t/op/svleak.t b/t/op/svleak.t index 15ffb46..d3c274f 100644 --- a/t/op/svleak.t +++ b/t/op/svleak.t @@ -15,7 +15,7 @@ BEGIN { use Config; -plan tests => 43; +plan tests => 44; # run some code N times. If the number of SVs at the end of loop N is # greater than (N-1)*delta at the end of loop 1, we've got a leak @@ -301,3 +301,12 @@ leak(2, 0, sub { }, "/(?{})\$x/ where \$x is $t does not leak"); } } + + +{ + use warnings FATAL => 'all'; + leak(2, 0, sub { + eval { printf uNopened 42 }; + }, 'printfing to bad handle under fatal warnings does not leak'); + +} -- 2.7.4