summaryrefslogtreecommitdiff
path: root/serverloop.c
diff options
context:
space:
mode:
Diffstat (limited to 'serverloop.c')
-rw-r--r--serverloop.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/serverloop.c b/serverloop.c
index ecc7763a4..773292a94 100644
--- a/serverloop.c
+++ b/serverloop.c
@@ -35,7 +35,7 @@
35 */ 35 */
36 36
37#include "includes.h" 37#include "includes.h"
38RCSID("$OpenBSD: serverloop.c,v 1.72 2001/06/27 02:12:52 markus Exp $"); 38RCSID("$OpenBSD: serverloop.c,v 1.73 2001/07/02 13:59:14 markus Exp $");
39 39
40#include "xmalloc.h" 40#include "xmalloc.h"
41#include "packet.h" 41#include "packet.h"
@@ -703,11 +703,25 @@ server_loop2(Authctxt *authctxt)
703 if (writeset) 703 if (writeset)
704 xfree(writeset); 704 xfree(writeset);
705 705
706 channel_free_all();
707
708 signal(SIGCHLD, SIG_DFL); 706 signal(SIGCHLD, SIG_DFL);
707
709 while ((pid = waitpid(-1, &status, WNOHANG)) > 0) 708 while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
710 session_close_by_pid(pid, status); 709 session_close_by_pid(pid, status);
710 /*
711 * there is a race between channel_free_all() killing children and
712 * children dying before kill()
713 */
714 channel_free_all();
715
716 while (session_have_children()) {
717 pid = waitpid(-1, &status, 0);
718 if (pid > 0)
719 session_close_by_pid(pid, status);
720 else {
721 error("waitpid returned %d: %s", pid, strerror(errno));
722 break;
723 }
724 }
711} 725}
712 726
713static void 727static void