>From efd2cce0de480ccb7a6f585f4fb933c506241d2f Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Sun, 18 Nov 2012 20:54:28 +0100 Subject: [PATCH] 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 | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/util/server.c b/src/util/server.c index 3dc9bcc0becbafc440a8d8ccf1a1bf1bbaadc622..b3073fcd130ba67a8cc7b5d63b8d1a20e28807ac 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); + 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; + } + } - /* return error if we didn't exited normally */ - 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); - } + if (WIFEXITED(status)) { + /* but return our exit code otherwise */ + ret = WEXITSTATUS(status); + } + } while (error == EINTR); _exit(ret); } -- 1.8.0