Skip to content

Commit

Permalink
Restore SIGCHLD to SIG_DFL where we care about waitpid().
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Jun 20, 2006
1 parent d281786 commit f0b7367
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 0 deletions.
5 changes: 5 additions & 0 deletions connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,11 @@ int git_connect(int fd[2], char *url, const char *prog)
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';
Expand Down
5 changes: 5 additions & 0 deletions daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,11 @@ int main(int argc, char **argv)
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];

Expand Down
5 changes: 5 additions & 0 deletions merge-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@ int main(int argc, char **argv)
{
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>*)");

Expand Down

0 comments on commit f0b7367

Please sign in to comment.