]> andersk Git - openssh.git/commitdiff
- markus@cvs.openbsd.org 2001/07/02 13:59:15
authormouring <mouring>
Wed, 4 Jul 2001 05:17:40 +0000 (05:17 +0000)
committermouring <mouring>
Wed, 4 Jul 2001 05:17:40 +0000 (05:17 +0000)
     [serverloop.c session.c session.h]
     wait until !session_have_children(); bugreport from
     Lutz.Jaenicke@aet.TU-Cottbus.DE

ChangeLog
serverloop.c
session.c
session.h

index c2d8a9d8598b92ba087d8ac11835da3fecf731d7..045223caa45f2ce121329a3baad1917da20364cc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
    - stevesk@cvs.openbsd.org 2001/06/30 18:08:40
      [channels.c channels.h clientloop.c]
      adress -> address; ok markus@
+   - markus@cvs.openbsd.org 2001/07/02 13:59:15
+     [serverloop.c session.c session.h]
+     wait until !session_have_children(); bugreport from 
+     Lutz.Jaenicke@aet.TU-Cottbus.DE
  
 20010629
  - (bal) Removed net_aton() since we don't use it any more
index ecc7763a4aa1c22296fef6e6b3f13ad5af7ff608..773292a94e9be8d176f0466d7526347710558f68 100644 (file)
@@ -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
index 818f3211bc4d193e1b5462984002802984e6ebe5..04b940721724ed5d935e2b57b81e6fceb688e954 100644 (file)
--- a/session.c
+++ b/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"
@@ -1959,6 +1959,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
index fd91ac17cc9fd08fcbba736509929df6b8eef940..a04fa6f2bcc95589f32e32f8532c0375e9502b59 100644 (file)
--- a/session.h
+++ b/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
This page took 0.493031 seconds and 5 git commands to generate.