aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@osdl.org>2006-02-11 10:41:22 -0800
committerJunio C Hamano <junkio@cox.net>2006-02-11 16:50:03 -0800
commit98deeaa82fb2b96395854e0574272ed21cbd81fe (patch)
tree00461313b09ef04e07561521f5fb307187e7f053
parentc548cf4ee0737a321ffe94f6a97c65baf87281be (diff)
downloadgit-98deeaa82fb2b96395854e0574272ed21cbd81fe.tar.gz
git-98deeaa82fb2b96395854e0574272ed21cbd81fe.tar.xz
Fix fetch-clone in the presense of signals
We shouldn't fail a fetch just because a signal might have interrupted the read. Normally, we don't install any signal handlers, so EINTR really shouldn't happen. That said, really old versions of Linux will interrupt an interruptible system call even for signals that turn out to be ignored (SIGWINCH is the classic example - resizing your xterm would cause it). The same might well be true elsewhere too. Also, since receive_keep_pack() doesn't control the caller, it can't know that no signal handlers exist. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--fetch-clone.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/fetch-clone.c b/fetch-clone.c
index 873312df3..da1b3ffba 100644
--- a/fetch-clone.c
+++ b/fetch-clone.c
@@ -178,10 +178,13 @@ int receive_keep_pack(int fd[2], const char *me, int quiet)
if (sz == 0)
break;
if (sz < 0) {
- error("error reading pack (%s)", strerror(errno));
- close(ofd);
- unlink(tmpfile);
- return -1;
+ if (errno != EINTR && errno != EAGAIN) {
+ error("error reading pack (%s)", strerror(errno));
+ close(ofd);
+ unlink(tmpfile);
+ return -1;
+ }
+ sz = 0;
}
pos = 0;
while (pos < sz) {