summaryrefslogtreecommitdiff
path: root/auth-pam.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2016-07-22 14:06:36 +1000
committerDamien Miller <djm@mindrot.org>2016-07-22 14:07:08 +1000
commit10358abd087ab228b7ce2048efc4f3854a9ab9a6 (patch)
treefbb26421dc03c512fd72c0908702e101535e0305 /auth-pam.c
parentda88a70a89c800e74ea8e5661ffa127a3cc79a92 (diff)
downloadopenssh-git-10358abd087ab228b7ce2048efc4f3854a9ab9a6.tar.gz
retry waitpid on EINTR failure
patch from Jakub Jelen on bz#2581; ok dtucker@
Diffstat (limited to 'auth-pam.c')
-rw-r--r--auth-pam.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/auth-pam.c b/auth-pam.c
index 1f13c181..348fe370 100644
--- a/auth-pam.c
+++ b/auth-pam.c
@@ -154,9 +154,12 @@ sshpam_sigchld_handler(int sig)
<= 0) {
/* PAM thread has not exitted, privsep slave must have */
kill(cleanup_ctxt->pam_thread, SIGTERM);
- if (waitpid(cleanup_ctxt->pam_thread, &sshpam_thread_status, 0)
- <= 0)
- return; /* could not wait */
+ while (waitpid(cleanup_ctxt->pam_thread,
+ &sshpam_thread_status, 0) == -1) {
+ if (errno == EINTR)
+ continue;
+ return;
+ }
}
if (WIFSIGNALED(sshpam_thread_status) &&
WTERMSIG(sshpam_thread_status) == SIGTERM)
@@ -217,7 +220,11 @@ pthread_join(sp_pthread_t thread, void **value)
if (sshpam_thread_status != -1)
return (sshpam_thread_status);
signal(SIGCHLD, sshpam_oldsig);
- waitpid(thread, &status, 0);
+ while (waitpid(thread, &status, 0) == -1) {
+ if (errno == EINTR)
+ continue;
+ fatal("%s: waitpid: %s", __func__, strerror(errno));
+ }
return (status);
}
#endif