tag 798096 patch fixed-upstream tag 808629 patch fixed-upstream thanks On Tue, Dec 22, 2015 at 09:11:43AM +0200, Niko Tyni wrote: > > Once there's a fix, the separate libautodie-perl needs to be fixed > first so that installing it over the Perl core version will not > reintroduce the bug. > > FWIW I made some progress on the upstream ticket yesterday but > it's not quite there yet. It would have been nice to hear about > this earlier.
Niels has merged the attached patch upstream (thanks!), so I suppose it's OK for us to backport it to both libautodie-perl and perl. Cc'ing Niels. Please let us know if you think it's too soon for that. -- Nio
>From c1b4fc4a319f8139d1cd6770bfb7b72a59ae232d Mon Sep 17 00:00:00 2001 From: Niko Tyni <nt...@debian.org> Date: Mon, 21 Dec 2015 19:20:12 +0200 Subject: [PATCH] Fix a scoping issue with "no autodie" and the "system" sub Don't queue nonexisting subs for reinstalling later when exiting the 'no autodie' scope. FIXME: if the original sub 'can be undef for "CORE::" subs', does this break for those? Is that the case when $symbol =~ /::/, as guarded for on L566? Bug: https://github.com/pjf/autodie/issues/69 Bug-Debian: https://bugs.debian.org/798096 --- lib/Fatal.pm | 7 ++++++- t/no-all.t | 22 ++++++++++++++++++++++ t/no-default.t | 23 +++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100755 t/no-all.t create mode 100755 t/no-default.t diff --git a/lib/Fatal.pm b/lib/Fatal.pm index 62ec1c0..d0f9cef 100644 --- a/lib/Fatal.pm +++ b/lib/Fatal.pm @@ -581,7 +581,12 @@ sub unimport { # Record the current sub to be reinstalled at end of scope # and then restore the original (can be undef for "CORE::" # subs) - $reinstall_subs{$symbol} = \&$sub; + + { + no strict 'refs'; + $reinstall_subs{$symbol} = \&$sub + if exists ${"${pkg}::"}{$symbol}; + } $uninstall_subs{$symbol} = $Original_user_sub{$sub}; } diff --git a/t/no-all.t b/t/no-all.t new file mode 100755 index 0000000..1a503f6 --- /dev/null +++ b/t/no-all.t @@ -0,0 +1,22 @@ +#!/usr/bin/perl + +package foo; +use warnings; +use strict; +use Test::More tests => 1; +use autodie qw(:all); + +use_system(); +ok("system() works with a lexical 'no autodie' block (github issue #69"); + +sub break_system { + no autodie; + open(my $fh, "<", 'NONEXISTENT'); + ok("survived failing open"); +} + +sub use_system { + system($^X, '-e' , 1); +} + +1; diff --git a/t/no-default.t b/t/no-default.t new file mode 100755 index 0000000..44d2acf --- /dev/null +++ b/t/no-default.t @@ -0,0 +1,23 @@ +#!/usr/bin/perl + +package foo; +use warnings; +use strict; +use Test::More tests => 2; +use autodie; + + +use_system(); +ok("system() works with a lexical 'no autodie' block (github issue #69"); +break_system(); + +sub break_system { + no autodie; + open(my $fh, "<", 'NONEXISTENT'); + ok("survived failing open"); +} + +sub use_system { + system($^X, '-e' , 1); +} +1; -- 2.6.4