From 5cecc26a9bb8f6478443fad2909ed0a3203a719d Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 17 Jul 2019 13:28:06 +0100 Subject: Dgit.pm: printcmd: Print in one go Sometimes this message is used to report failure of `git fetch' etc. But when such operations fail, they may interleave output from the remote git, which typically prints fatal: The remote end hung up unexpectedly (referring to the local end as the `remote' end, from its point of view), after the the local end printed its message and failed. This sets up a race between Dgit.pm's printcmd and the message from the remote. If we're really unlucky, the remote's message interrupts the output from printcmd. We can avoid the within-line interleaving - at least, the interruption of our message - by printing the whole message in one go, so do that. (Strictly, the approach we use here only ensures that the message appears in a single write(2) call if it fits in the stdio buffer.) One of our test cases (tagupl) depends on this message not being split and has a small chance of failing without this fix. Signed-off-by: Ian Jackson --- Debian/Dgit.pm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'Debian') diff --git a/Debian/Dgit.pm b/Debian/Dgit.pm index 9c1a08e..d99e520 100644 --- a/Debian/Dgit.pm +++ b/Debian/Dgit.pm @@ -219,9 +219,7 @@ sub shellquote { sub printcmd { my $fh = shift @_; my $intro = shift @_; - print $fh $intro," " or confess "$!"; - print $fh shellquote @_ or confess "$!"; - print $fh "\n" or confess "$!"; + print $fh $intro." ".(join '', shellquote @_)."\n" or confess "$!"; } sub debugcmd { -- cgit v1.2.3