From: Lennart Poettering Date: Thu, 30 Jun 2011 02:15:39 +0000 (+0200) Subject: execute: invoke sigwait() in a loop when waiting for PAM parent, to avoid spurious... X-Git-Tag: v30~86 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=3dead8d925ea9db1fbd65b702b6b807e49ddeacf execute: invoke sigwait() in a loop when waiting for PAM parent, to avoid spurious wake-ups --- diff --git a/src/execute.c b/src/execute.c index 1a5f09d32..c69442d0f 100644 --- a/src/execute.c +++ b/src/execute.c @@ -843,7 +843,7 @@ static int setup_pam( /* This string must fit in 10 chars (i.e. the length * of "/sbin/init") */ - rename_process("sd:pam"); + rename_process("sd(PAM)"); /* Make sure we don't keep open the passed fds in this child. We assume that otherwise only those fds are @@ -861,13 +861,20 @@ static int setup_pam( /* Check if our parent process might already have * died? */ if (getppid() == parent_pid) { - if (sigwait(&ss, &sig) < 0) - goto child_finish; + for (;;) { + if (sigwait(&ss, &sig) < 0) { + if (errno == EINTR) + continue; + + goto child_finish; + } - assert(sig == SIGTERM); + assert(sig == SIGTERM); + break; + } } - /* Only if our parent died we'll end the session */ + /* If our parent died we'll end the session */ if (getppid() != parent_pid) if ((pam_code = pam_close_session(handle, PAM_DATA_SILENT)) != PAM_SUCCESS) goto child_finish;