From: Ian Jackson Date: Wed, 11 Jan 2017 23:31:37 +0000 (+0000) Subject: dgit: Do not execute END blocks in children. X-Git-Tag: archive/debian/3.2~13 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=commitdiff_plain;h=fcb31fe3655f197956bb61f89c54638db4c14265;ds=sidebyside dgit: Do not execute END blocks in children. END blocks run inside children created by fork or piped open (the latter, if they run perl code), on exit or (I think maybe) die. This is far from appropriate. So far symptoms of this bug seem to be limited to duplicated error messages but I have not done a thorough analysis. Closes:#850052. Signed-off-by: Ian Jackson --- diff --git a/debian/changelog b/debian/changelog index 9f7b5fa6..8edf5274 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,9 @@ dgit (3.2~) unstable; urgency=medium - * + Bugfixes: + * dgit: Do not execute END blocks in children. So far symptoms of this + bug seem to be limited to duplicated error messages but I have not + done a thorough analysis. Closes:#850052. -- diff --git a/dgit b/dgit index f7f2b710..afdf2c58 100755 --- a/dgit +++ b/dgit @@ -156,6 +156,7 @@ our $split_brain = 0; END { local ($@, $?); + return unless forkcheck_mainprocess(); print STDERR "! $_\n" foreach $supplementary_message =~ m/^.+$/mg; } @@ -220,6 +221,7 @@ initdebug(''); our @end; END { local ($?); + return unless forkcheck_mainprocess(); foreach my $f (@end) { eval { $f->(); }; print STDERR "$us: cleanup: $@" if length $@; @@ -4473,7 +4475,10 @@ sub i_cleanup { } } -END { i_cleanup(); } +END { + return unless forkcheck_mainprocess(); + i_cleanup(); +} sub i_method { my ($base,$selector,@args) = @_;