From 01c94d1bc4d80b8ff23401462dfe4dca7148adb1 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Sun, 18 Nov 2012 20:54:28 +0100 Subject: SERVER: Check the return value of waitpid We should at least print an error message and error out if waitpid() fails. https://fedorahosted.org/sssd/ticket/1651 --- src/util/server.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/util/server.c b/src/util/server.c index 3dc9bcc0b..b3073fcd1 100644 --- a/src/util/server.c +++ b/src/util/server.c @@ -79,9 +79,9 @@ static void deamon_parent_sigterm(int sig) void become_daemon(bool Fork) { - pid_t pid; + pid_t pid, cpid; int status; - int ret; + int ret, error; if (Fork) { pid = fork(); @@ -93,15 +93,31 @@ void become_daemon(bool Fork) CatchSignal(SIGTERM, deamon_parent_sigterm); /* or exit when sssd monitor is terminated */ - waitpid(pid, &status, 0); - - /* return error if we didn't exited normally */ - ret = 1; - - if (WIFEXITED(status)) { - /* but return our exit code otherwise */ - ret = WEXITSTATUS(status); - } + do { + errno = 0; + cpid = waitpid(pid, &status, 0); + if (cpid == 1) { + /* An error occurred while waiting */ + error = errno; + if (error != EINTR) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Error [%d][%s] while waiting for child\n", + error, strerror(error))); + /* Forcibly kill this child */ + kill(pid, SIGKILL); + ret = 1; + } + } + + error = 0; + /* return error if we didn't exited normally */ + ret = 1; + + if (WIFEXITED(status)) { + /* but return our exit code otherwise */ + ret = WEXITSTATUS(status); + } + } while (error == EINTR); _exit(ret); } -- cgit