From 60cd48bd1425610fbdcdb20249210c7f986cb31d Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 7 Dec 2009 15:18:17 +0100 Subject: [PATCH] flock: fix hang when parent ignores SIGCHLD If flock is executed from a process which has set SIGCHLD to SIG_IGN, then flock will eat cpu and hang indefinitely if given a command to execute. So before we fork(), make sure to set SIGCHLD handling back to the default so that the later waitpid() doesn't freak out on us. [kzak@redhat.com: - add a check for waitpid() return value] Signed-off-by: Mike Frysinger Signed-off-by: Karel Zak --- sys-utils/flock.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sys-utils/flock.c b/sys-utils/flock.c index a53f6d31..75c007c7 100644 --- a/sys-utils/flock.c +++ b/sys-utils/flock.c @@ -287,6 +287,8 @@ int main(int argc, char *argv[]) if ( cmd_argv ) { pid_t w, f; + /* Clear any inherited settings */ + signal(SIGCHLD, SIG_DFL); f = fork(); if ( f < 0 ) { @@ -304,9 +306,15 @@ int main(int argc, char *argv[]) } else { do { w = waitpid(f, &status, 0); + if (w == -1 && errno != EINTR) + break; } while ( w != f ); - if ( WIFEXITED(status) ) + if (w == -1) { + err = errno; + status = EXIT_FAILURE; + fprintf(stderr, "%s: waitpid failed: %s\n", program, strerror(err)); + } else if ( WIFEXITED(status) ) status = WEXITSTATUS(status); else if ( WIFSIGNALED(status) ) status = WTERMSIG(status) + 128; -- 2.39.5