diff options
author | Damien Miller <djm@mindrot.org> | 2000-10-15 12:21:32 +1100 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2000-10-15 12:21:32 +1100 |
commit | 5993935f76e66c957f02efaa8fc0c8ff8a3f92c9 (patch) | |
tree | b8bc95b6caf3a4eeb66645409be9728c327ea6d9 | |
parent | b4df15d1e119994ad1f3e73c1283414d2eb30a5f (diff) |
- (djm) Fix ssh2 hang on background processes at logout.
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | rijndael.h | 2 | ||||
-rw-r--r-- | serverloop.c | 3 | ||||
-rw-r--r-- | session.c | 4 |
4 files changed, 11 insertions, 1 deletions
@@ -1,3 +1,6 @@ +20001015 + - (djm) Fix ssh2 hang on background processes at logout. + 20001014 - (bal) Add support for realpath and getcwd for platforms with broken or missing realpath implementations for sftp-server. @@ -1,6 +1,8 @@ #ifndef _RIJNDAEL_H_ #define _RIJNDAEL_H_ +#include "config.h" + /* 1. Standard types for AES cryptography source code */ typedef u_int8_t u1byte; /* an 8 bit unsigned character type */ diff --git a/serverloop.c b/serverloop.c index 25320348..0c07a282 100644 --- a/serverloop.c +++ b/serverloop.c @@ -671,7 +671,8 @@ server_loop2(void) if (packet_not_very_much_data_to_write()) channel_output_poll(); wait_until_can_do_something(&readset, &writeset, 0); - if (child_terminated) { + if (child_terminated && child_has_selected) { + /* XXX: race - assumes only one child has terminated */ while ((pid = waitpid(-1, &status, WNOHANG)) > 0) session_close_by_pid(pid, status); child_terminated = 0; @@ -1846,9 +1846,13 @@ session_exit_message(Session *s, int status) * interested in data we write. * Note that we must not call 'chan_read_failed', since there could * be some more data waiting in the pipe. + * djm - This is no longer true as we have allowed one pass through + * the select loop before killing the connection */ if (c->ostate != CHAN_OUTPUT_CLOSED) chan_write_failed(c); + if (c->istate != CHAN_INPUT_CLOSED) + chan_read_failed(c); s->chanid = -1; } |