]> andersk Git - openssh.git/commitdiff
- markus@cvs.openbsd.org 2001/10/09 19:51:18
authordjm <djm>
Wed, 10 Oct 2001 05:08:36 +0000 (05:08 +0000)
committerdjm <djm>
Wed, 10 Oct 2001 05:08:36 +0000 (05:08 +0000)
     [serverloop.c]
     close all channels if the connection to the remote host has been closed,
     should fix sshd's hanging with WCHAN==wait

ChangeLog
serverloop.c

index faac243a472f0623e6e642524ca7d2734ded1fd7..4b28d44f5063da9499cd8297c0f7f1f56af42341 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
    - markus@cvs.openbsd.org 2001/10/09 19:32:49
      [session.c]
      stat subsystem command before calling do_exec, and return error to client.
+   - markus@cvs.openbsd.org 2001/10/09 19:51:18
+     [serverloop.c]
+     close all channels if the connection to the remote host has been closed,
+     should fix sshd's hanging with WCHAN==wait
 
 20011007
  - (bal) ssh-copy-id corrected permissions for .ssh/ and authorized_keys.
index 4577cc804adff9fa7e5562fb8d0053a64fc5f659..d7282fe2a266f738e930ff41a87390bbcf980686 100644 (file)
@@ -35,7 +35,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: serverloop.c,v 1.79 2001/10/04 15:12:37 markus Exp $");
+RCSID("$OpenBSD: serverloop.c,v 1.80 2001/10/09 19:51:18 markus Exp $");
 
 #include "xmalloc.h"
 #include "packet.h"
@@ -699,6 +699,7 @@ server_loop2(Authctxt *authctxt)
                if (child_terminated) {
                        while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
                                session_close_by_pid(pid, status);
+                       /* XXX race */
                        child_terminated = 0;
                }
                if (!rekeying)
@@ -708,6 +709,9 @@ server_loop2(Authctxt *authctxt)
                        break;
                process_output(writeset);
        }
+       /* close all channels, no more reads and writes */
+       channel_close_all();
+
        if (readset)
                xfree(readset);
        if (writeset)
@@ -715,14 +719,14 @@ server_loop2(Authctxt *authctxt)
 
        mysignal(SIGCHLD, SIG_DFL);
 
+       /* collect dead children */
        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()
+        * there is a race between channel_detach_all() killing remaining
+        * children and children dying before kill()
         */
        channel_detach_all();
-       channel_stop_listening();
 
        while (session_have_children()) {
                pid = waitpid(-1, &status, 0);
This page took 0.74254 seconds and 5 git commands to generate.