diff options
author | 2002-03-30 18:51:15 +0000 | |
---|---|---|
committer | 2002-03-30 18:51:15 +0000 | |
commit | d16f19a93e36c7bfdc110ac4610d165f1a74de66 (patch) | |
tree | 0fd94b045ace9ce27a3a8f09d8f8fe82b4a33bcf /usr.bin/ssh/serverloop.c | |
parent | implement WEP in wi_do_hostencrypt() (diff) | |
download | wireguard-openbsd-d16f19a93e36c7bfdc110ac4610d165f1a74de66.tar.xz wireguard-openbsd-d16f19a93e36c7bfdc110ac4610d165f1a74de66.zip |
check waitpid for EINTR; based on patch from peter@ifm.liu.se
Diffstat (limited to 'usr.bin/ssh/serverloop.c')
-rw-r--r-- | usr.bin/ssh/serverloop.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/usr.bin/ssh/serverloop.c b/usr.bin/ssh/serverloop.c index 93d0c30b55d..8046cd53472 100644 --- a/usr.bin/ssh/serverloop.c +++ b/usr.bin/ssh/serverloop.c @@ -35,7 +35,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: serverloop.c,v 1.100 2002/03/24 16:00:27 markus Exp $"); +RCSID("$OpenBSD: serverloop.c,v 1.101 2002/03/30 18:51:15 markus Exp $"); #include "xmalloc.h" #include "packet.h" @@ -670,10 +670,10 @@ server_loop(pid_t pid, int fdin_arg, int fdout_arg, int fderr_arg) /* We no longer want our SIGCHLD handler to be called. */ signal(SIGCHLD, SIG_DFL); - wait_pid = waitpid(-1, &wait_status, 0); - if (wait_pid == -1) - packet_disconnect("wait: %.100s", strerror(errno)); - else if (wait_pid != pid) + while ((wait_pid = waitpid(-1, &wait_status, 0)) < 0) + if (errno != EINTR) + packet_disconnect("wait: %.100s", strerror(errno)); + if (wait_pid != pid) error("Strange, wait returned pid %d, expected %d", wait_pid, pid); @@ -723,8 +723,10 @@ collect_children(void) sigaddset(&nset, SIGCHLD); sigprocmask(SIG_BLOCK, &nset, &oset); if (child_terminated) { - while ((pid = waitpid(-1, &status, WNOHANG)) > 0) - session_close_by_pid(pid, status); + while ((pid = waitpid(-1, &status, WNOHANG)) > 0 || + (pid < 0 && errno == EINTR)) + if (pid > 0) + session_close_by_pid(pid, status); child_terminated = 0; } sigprocmask(SIG_SETMASK, &oset, NULL); |