summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: d281786)
raw | patch | inline | side by side (parent: d281786)
author | Junio C Hamano <junkio@cox.net> | |
Tue, 20 Jun 2006 01:25:21 +0000 (18:25 -0700) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Tue, 20 Jun 2006 01:44:58 +0000 (18:44 -0700) |
It was reported that under one implementation of socks client
"git clone" fails with "error: waitpid failed (No child processes)",
because "git" is spawned after setting SIGCHLD to SIG_IGN.
Arguably it may be a broken setting, but we should protect
ourselves so that we can get reliable results from waitpid() for
the children we care about.
This patch resets SIGCHLD to SIG_DFL in three places:
- connect.c::git_connect() - initiators of git native
protocol transfer are covered with this.
- daemon.c::main() - obviously.
- merge-index.c::main() - obviously.
There are other programs that do fork() but do not waitpid():
http-push, imap-send. upload-pack does not either, but in the
case of that program, each of the forked halves runs exec()
another program, so this change would not have much effect
there.
Signed-off-by: Junio C Hamano <junkio@cox.net>
"git clone" fails with "error: waitpid failed (No child processes)",
because "git" is spawned after setting SIGCHLD to SIG_IGN.
Arguably it may be a broken setting, but we should protect
ourselves so that we can get reliable results from waitpid() for
the children we care about.
This patch resets SIGCHLD to SIG_DFL in three places:
- connect.c::git_connect() - initiators of git native
protocol transfer are covered with this.
- daemon.c::main() - obviously.
- merge-index.c::main() - obviously.
There are other programs that do fork() but do not waitpid():
http-push, imap-send. upload-pack does not either, but in the
case of that program, each of the forked halves runs exec()
another program, so this change would not have much effect
there.
Signed-off-by: Junio C Hamano <junkio@cox.net>
connect.c | patch | blob | history | |
daemon.c | patch | blob | history | |
merge-index.c | patch | blob | history |
diff --git a/connect.c b/connect.c
index 52d709e58d53f053ec00bfb9f31501684cbaf0e5..db7342e4d26baa50dd944ebf06fb8b66fea59aaa 100644 (file)
--- a/connect.c
+++ b/connect.c
enum protocol protocol = PROTO_LOCAL;
int free_path = 0;
+ /* Without this we cannot rely on waitpid() to tell
+ * what happened to our children.
+ */
+ signal(SIGCHLD, SIG_DFL);
+
host = strstr(url, "://");
if(host) {
*host = '\0';
diff --git a/daemon.c b/daemon.c
index 2f03f99d2d9f2ed9a23932e5104456f69b721116..10670047f267e86a6831562749914a8cf4187334 100644 (file)
--- a/daemon.c
+++ b/daemon.c
int inetd_mode = 0;
int i;
+ /* Without this we cannot rely on waitpid() to tell
+ * what happened to our children.
+ */
+ signal(SIGCHLD, SIG_DFL);
+
for (i = 1; i < argc; i++) {
char *arg = argv[i];
diff --git a/merge-index.c b/merge-index.c
index 024196e7ac53cb9ad09b38ea646bad81aff33306..190e12fb7ceeb012a063f8c97b574e9650d95cc1 100644 (file)
--- a/merge-index.c
+++ b/merge-index.c
{
int i, force_file = 0;
+ /* Without this we cannot rely on waitpid() to tell
+ * what happened to our children.
+ */
+ signal(SIGCHLD, SIG_DFL);
+
if (argc < 3)
usage("git-merge-index [-o] [-q] <merge-program> (-a | <filename>*)");