summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2011-05-16 06:52:57 (GMT)
committerJunio C Hamano <gitster@pobox.com>2011-05-16 23:20:01 (GMT)
commita1a3fd1f40a67165b849a2a1210ff3a7a2cbcdd6 (patch)
treec600ee91fdf2ad92287db70d1048ee2928fc56d2
parent7ffe853b106680720ddec999e1daf5c186997a1f (diff)
downloadgit-a1a3fd1f40a67165b849a2a1210ff3a7a2cbcdd6.zip
git-a1a3fd1f40a67165b849a2a1210ff3a7a2cbcdd6.tar.gz
git-a1a3fd1f40a67165b849a2a1210ff3a7a2cbcdd6.tar.bz2
send-pack: avoid deadlock on git:// push with failed pack-objects
Commit 09c9957c fixes a deadlock in which pack-objects fails, the remote end is still waiting for pack data, and we are still waiting for the remote end to say something (see that commit for a much more in-depth explanation). We solved the problem there by making sure the output pipe is closed on error; thus the remote sees EOF, and proceeds to complain and close its end of the connection. However, in the special case of push over git://, we don't have a pipe, but rather a full-duplex socket, with another dup()-ed descriptor in place of the second half of the pipe. In this case, closing the second descriptor signals nothing to the remote end, and we still deadlock. This patch calls shutdown() explicitly to signal EOF to the other side. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-send-pack.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/builtin-send-pack.c b/builtin-send-pack.c
index dfd3d11..eef19cb 100644
--- a/builtin-send-pack.c
+++ b/builtin-send-pack.c
@@ -520,6 +520,8 @@ int send_pack(struct send_pack_args *args,
ref->status = REF_STATUS_NONE;
if (args->stateless_rpc)
close(out);
+ if (git_connection_is_socket(conn))
+ shutdown(fd[0], SHUT_WR);
if (use_sideband)
finish_async(&demux);
return -1;