diff --git a/ChangeLog b/ChangeLog index f5a13d21d..7c7832556 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,11 @@ don't kill the login shells if the shells stdin/out/err is closed. this should now work: ssh -2n localhost 'exec > /dev/null 2>&1; sleep 10; exit 5'; echo ? + - markus@cvs.openbsd.org 2001/10/11 13:45:21 + [session.c] + delay detach of session if a channel gets closed but the child is + still alive. however, release pty, since the fd's to the child are + already closed. 20011010 - (djm) OpenBSD CVS Sync @@ -6705,4 +6710,4 @@ - Wrote replacements for strlcpy and mkdtemp - Released 1.0pre1 -$Id: ChangeLog,v 1.1601 2001/10/12 01:35:04 djm Exp $ +$Id: ChangeLog,v 1.1602 2001/10/12 01:35:50 djm Exp $ diff --git a/session.c b/session.c index 6ba2e7c77..e9d8ceb73 100644 --- a/session.c +++ b/session.c @@ -33,7 +33,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: session.c,v 1.107 2001/10/10 22:18:47 markus Exp $"); +RCSID("$OpenBSD: session.c,v 1.108 2001/10/11 13:45:21 markus Exp $"); #include "ssh.h" #include "ssh1.h" @@ -1865,6 +1865,9 @@ session_pty_cleanup(void *session) */ if (close(s->ptymaster) < 0) error("close(s->ptymaster): %s", strerror(errno)); + + /* unlink pty from session */ + s->ttyfd = -1; } static void @@ -1963,8 +1966,15 @@ session_close_by_channel(int id, void *arg) } debug("session_close_by_channel: channel %d child %d", id, s->pid); if (s->pid != 0) { - /* delay detach */ debug("session_close_by_channel: channel %d: has child", id); + /* + * delay detach of session, but release pty, since + * the fd's to the child are already closed + */ + if (s->ttyfd != -1) { + fatal_remove_cleanup(session_pty_cleanup, (void *)s); + session_pty_cleanup(s); + } return; } /* detach by removing callback */