aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-12-29 02:35:40 -0800
committerJunio C Hamano <junkio@cox.net>2006-12-29 11:37:01 -0800
commite40a9e2c9ed0723088e0fb65deb9b430fc91c367 (patch)
treee129c5cad763d28285e53abc5fd59bb9e858ee54
parent1ed4813f7d018eb35187209d43b98746a2e69542 (diff)
downloadgit-e40a9e2c9ed0723088e0fb65deb9b430fc91c367.tar.gz
git-e40a9e2c9ed0723088e0fb65deb9b430fc91c367.tar.xz
send-pack: fix pipeline.
send-pack builds a pipeline that runs "rev-list | pack-objects" and sends the output from pack-objects to the other side, while feeding the input side of that pipe from itself. However, the file descriptor that is given to this pipeline (so that it can be dup2(2)'ed into file descriptor 1 of pack-objects) is closed by the caller before the complex fork+exec dance! Worse yet, the caller already dup2's it to 1, so the child process did not even have to. I do not understand how this code could possibly have been working, but it somehow was working by accident. Merging the sliding mmap() code reveals this problem, presumably because it keeps one extra file descriptor open for a packfile and changes the way file descriptors are allocated. I am too tired to diagnose the problem now, but this seems to be a sensible fix. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--send-pack.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/send-pack.c b/send-pack.c
index cc884f3b2..54de96e40 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -58,7 +58,7 @@ static void exec_rev_list(struct ref *refs)
/*
* Run "rev-list --stdin | pack-objects" pipe.
*/
-static void rev_list(int fd, struct ref *refs)
+static void rev_list(struct ref *refs)
{
int pipe_fd[2];
pid_t pack_objects_pid;
@@ -71,10 +71,8 @@ static void rev_list(int fd, struct ref *refs)
* and writes to the original fd
*/
dup2(pipe_fd[0], 0);
- dup2(fd, 1);
close(pipe_fd[0]);
close(pipe_fd[1]);
- close(fd);
exec_pack_objects();
die("pack-objects setup failed");
}
@@ -85,7 +83,6 @@ static void rev_list(int fd, struct ref *refs)
dup2(pipe_fd[1], 1);
close(pipe_fd[0]);
close(pipe_fd[1]);
- close(fd);
exec_rev_list(refs);
}
@@ -111,7 +108,7 @@ static void rev_list_generate(int fd, struct ref *refs)
close(pipe_fd[0]);
close(pipe_fd[1]);
close(fd);
- rev_list(fd, refs);
+ rev_list(refs);
die("rev-list setup failed");
}
if (rev_list_generate_pid < 0)