[Reproducible-commits] [dpkg] 08/09: dpkg-source: don't die on SIGPIPE of uncompressors
Holger Levsen
holger at layer-acht.org
Tue May 3 08:42:58 UTC 2016
This is an automated email from the git hooks/post-receive script.
holger pushed a commit to annotated tag 1.14.26
in repository dpkg.
commit 7c75872f5cf43b98fc7facbe057c3f98d50a4172
Author: Raphael Hertzog <hertzog at debian.org>
Date: Thu Apr 9 18:35:10 2009 +0200
dpkg-source: don't die on SIGPIPE of uncompressors
Modify Dpkg::Source::CompressedFile to not die when uncompressors
processes (gunzip, bunzip, etc.) are killed by SIGPIPE. Recent tar
versions close the pipe before having read everything sent by the
uncompressor process when they encounter the end of the tar file.
This was of course problematic for Dpkg::Source::Archive.
This is a regression compared to etch's dpkg-source which dealt with
SIGPIPE properly.
The Dpkg::Source::Compressor::wait_end_process() function had to be
extended to be able to forward options to Dpkg::IPC::wait_child().
---
ChangeLog | 8 ++++++++
debian/changelog | 5 +++++
scripts/Dpkg/Source/CompressedFile.pm | 12 ++++++++++--
scripts/Dpkg/Source/Compressor.pm | 5 +++--
4 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index bf839a7..db7ebb9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-04-09 Raphael Hertzog <hertzog at debian.org>
+
+ * scripts/Dpkg/Source/CompressedFile.pm (cleanup_after_open): Do
+ not die when uncompressors processes (gunzip, bunzip, etc.) are
+ killed by SIGPIPE.
+ * scripts/Dpkg/Source/Compressor.pm (wait_end_process): Modified
+ so that it can forward options to Dpkg::IPC::wait_child().
+
2009-02-03 Guillem Jover <guillem at debian.org>
* configure.ac: Bump version to 1.14.26~.
diff --git a/debian/changelog b/debian/changelog
index 79223b5..f813d13 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,10 @@
dpkg (1.14.26) UNRELEASED; urgency=low
+ [ Raphael Hertzog ]
+ * Fix dpkg-source to not die when uncompressor processes are killed by
+ SIGPIPE due to tar closing the pipe without exhausting all the data
+ available. Closes: #523329
+
[ Updated scripts translations ]
* German (Helge Kreutzmann).
* Polish (Wiktor Wandachowicz). Closes: #514106
diff --git a/scripts/Dpkg/Source/CompressedFile.pm b/scripts/Dpkg/Source/CompressedFile.pm
index 94fdce9..8367b93 100644
--- a/scripts/Dpkg/Source/CompressedFile.pm
+++ b/scripts/Dpkg/Source/CompressedFile.pm
@@ -22,7 +22,8 @@ use warnings;
use Dpkg::Compression;
use Dpkg::Source::Compressor;
use Dpkg::Gettext;
-use Dpkg::ErrorHandling qw(error syserr warning);
+use Dpkg::ErrorHandling qw(error syserr warning subprocerr);
+use POSIX;
# Object methods
sub new {
@@ -35,6 +36,7 @@ sub new {
$self->{"compressor"} = Dpkg::Source::Compressor->new();
$self->{"add_comp_ext"} = $args{"add_compression_extension"} ||
$args{"add_comp_ext"} || 0;
+ $self->{"allow_sigpipe"} = 0;
if (exists $args{"filename"}) {
$self->set_filename($args{"filename"});
}
@@ -126,6 +128,7 @@ sub open_for_read {
if ($self->use_compression()) {
$self->{'compressor'}->uncompress(to_pipe => \$handle,
from_file => $self->get_filename());
+ $self->{'allow_sigpipe'} = 1;
} else {
open($handle, '<', $self->get_filename()) ||
syserr(_g("cannot read %s"), $self->get_filename());
@@ -135,7 +138,12 @@ sub open_for_read {
sub cleanup_after_open {
my ($self) = @_;
- $self->{"compressor"}->wait_end_process();
+ $self->{"compressor"}->wait_end_process(nocheck => $self->{'allow_sigpipe'});
+ if ($self->{'allow_sigpipe'}) {
+ unless (($? == 0) || (WIFSIGNALED($?) && (WTERMSIG($?) == SIGPIPE))) {
+ subprocerr($self->{"compressor"}{"cmdline"});
+ }
+ }
}
1;
diff --git a/scripts/Dpkg/Source/Compressor.pm b/scripts/Dpkg/Source/Compressor.pm
index 1843a2f..6797a49 100644
--- a/scripts/Dpkg/Source/Compressor.pm
+++ b/scripts/Dpkg/Source/Compressor.pm
@@ -122,8 +122,9 @@ sub uncompress {
}
sub wait_end_process {
- my ($self) = @_;
- wait_child($self->{"pid"}, cmdline => $self->{"cmdline"}) if $self->{'pid'};
+ my ($self, %opts) = @_;
+ $opts{"cmdline"} ||= $self->{"cmdline"};
+ wait_child($self->{"pid"}, %opts) if $self->{'pid'};
delete $self->{"pid"};
delete $self->{"cmdline"};
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/dpkg.git
More information about the Reproducible-commits
mailing list