From 3dead8d925ea9db1fbd65b702b6b807e49ddeacf Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 30 Jun 2011 04:15:39 +0200 Subject: [PATCH] execute: invoke sigwait() in a loop when waiting for PAM parent, to avoid spurious wake-ups --- src/execute.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) 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; -- 2.30.2