diff options
author | Damien Miller <djm@mindrot.org> | 2016-07-22 14:06:36 +1000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2016-07-22 14:07:08 +1000 |
commit | 10358abd087ab228b7ce2048efc4f3854a9ab9a6 (patch) | |
tree | fbb26421dc03c512fd72c0908702e101535e0305 /auth-pam.c | |
parent | da88a70a89c800e74ea8e5661ffa127a3cc79a92 (diff) | |
download | openssh-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.c | 15 |
1 files changed, 11 insertions, 4 deletions
@@ -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 |