diff options
-rw-r--r-- | usr.bin/ssh/serverloop.c | 20 | ||||
-rw-r--r-- | usr.bin/ssh/session.c | 18 | ||||
-rw-r--r-- | usr.bin/ssh/session.h | 3 |
3 files changed, 36 insertions, 5 deletions
diff --git a/usr.bin/ssh/serverloop.c b/usr.bin/ssh/serverloop.c index cc089f326b8..c5ef95b7061 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.72 2001/06/27 02:12:52 markus Exp $"); +RCSID("$OpenBSD: serverloop.c,v 1.73 2001/07/02 13:59:14 markus Exp $"); #include "xmalloc.h" #include "packet.h" @@ -703,11 +703,25 @@ server_loop2(Authctxt *authctxt) if (writeset) xfree(writeset); - channel_free_all(); - signal(SIGCHLD, SIG_DFL); + while ((pid = waitpid(-1, &status, WNOHANG)) > 0) session_close_by_pid(pid, status); + /* + * there is a race between channel_free_all() killing children and + * children dying before kill() + */ + channel_free_all(); + + while (session_have_children()) { + pid = waitpid(-1, &status, 0); + if (pid > 0) + session_close_by_pid(pid, status); + else { + error("waitpid returned %d: %s", pid, strerror(errno)); + break; + } + } } static void diff --git a/usr.bin/ssh/session.c b/usr.bin/ssh/session.c index 10a86164de0..b705c189147 100644 --- a/usr.bin/ssh/session.c +++ b/usr.bin/ssh/session.c @@ -33,7 +33,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: session.c,v 1.97 2001/06/27 02:12:53 markus Exp $"); +RCSID("$OpenBSD: session.c,v 1.98 2001/07/02 13:59:15 markus Exp $"); #include "ssh.h" #include "ssh1.h" @@ -1582,6 +1582,22 @@ session_close_by_pid(pid_t pid, int status) session_close(s); } +int +session_have_children(void) +{ + int i; + + for(i = 0; i < MAX_SESSIONS; i++) { + Session *s = &sessions[i]; + if (s->used && s->pid != -1) { + debug("session_have_children: id %d pid %d", i, s->pid); + return 1; + } + } + debug("session_have_children: no more children"); + return 0; +} + /* * this is called when a channel dies before * the session 'child' itself dies diff --git a/usr.bin/ssh/session.h b/usr.bin/ssh/session.h index fd91ac17cc9..a04fa6f2bcc 100644 --- a/usr.bin/ssh/session.h +++ b/usr.bin/ssh/session.h @@ -1,4 +1,4 @@ -/* $OpenBSD: session.h,v 1.10 2001/06/27 02:12:54 markus Exp $ */ +/* $OpenBSD: session.h,v 1.11 2001/07/02 13:59:15 markus Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. @@ -32,5 +32,6 @@ int session_open(Authctxt*, int); void session_input_channel_req(int, void *); void session_close_by_pid(pid_t, int); void session_close_by_channel(int, void *); +int session_have_children(void); #endif |