summaryrefslogtreecommitdiffstats
path: root/src/util/server.c
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2012-11-18 20:54:28 +0100
committerJakub Hrozek <jhrozek@redhat.com>2012-11-19 14:15:48 +0100
commitdae0a9fa4a2c76c964c06b6607d78498cdb8d799 (patch)
treebb0d175b22b8913f099deef95b0404a5279ff7c1 /src/util/server.c
parent4c9a85ab708ec7debecad51e4240e04d8bc6ca4e (diff)
downloadsssd-dae0a9fa4a2c76c964c06b6607d78498cdb8d799.tar.gz
sssd-dae0a9fa4a2c76c964c06b6607d78498cdb8d799.tar.xz
sssd-dae0a9fa4a2c76c964c06b6607d78498cdb8d799.zip
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
Diffstat (limited to 'src/util/server.c')
-rw-r--r--src/util/server.c38
1 files changed, 27 insertions, 11 deletions
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);
}