diff options
author | Damien Miller <djm@cvs.openbsd.org> | 2008-06-15 20:06:27 +0000 |
---|---|---|
committer | Damien Miller <djm@cvs.openbsd.org> | 2008-06-15 20:06:27 +0000 |
commit | 922d77c92001e7dfc666b4449039d71499b11cd3 (patch) | |
tree | b2a7dcd7df3ee666a37c33bc44cad70d71e89829 /usr.bin/ssh/session.c | |
parent | c90e5a5502fbeebc73f91a48389aaf3d3993f23c (diff) |
don't call isatty() on a pty master, instead pass a flag down to
channel_set_fds() indicating that te fds refer to a tty. Fixes a
hang on exit on Solaris (bz#1463) in portable but is actually
a generic bug; ok dtucker deraadt markus
Diffstat (limited to 'usr.bin/ssh/session.c')
-rw-r--r-- | usr.bin/ssh/session.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/usr.bin/ssh/session.c b/usr.bin/ssh/session.c index 8fb7e5124d5..089926e27d3 100644 --- a/usr.bin/ssh/session.c +++ b/usr.bin/ssh/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.239 2008/06/14 18:33:43 djm Exp $ */ +/* $OpenBSD: session.c,v 1.240 2008/06/15 20:06:26 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland * All rights reserved @@ -90,7 +90,7 @@ /* func */ Session *session_new(void); -void session_set_fds(Session *, int, int, int); +void session_set_fds(Session *, int, int, int, int); void session_pty_cleanup(Session *); void session_proctitle(Session *); int session_setup_x11fwd(Session *); @@ -557,7 +557,7 @@ do_exec_no_pty(Session *s, const char *command) close(perr[0]); perr[0] = -1; } - session_set_fds(s, pin[1], pout[0], perr[0]); + session_set_fds(s, pin[1], pout[0], perr[0], 0); } else { /* Enter the interactive session. */ server_loop(pid, pin[1], pout[0], perr[0]); @@ -574,7 +574,7 @@ do_exec_no_pty(Session *s, const char *command) */ if (compat20) { session_set_fds(s, inout[1], inout[1], - s->is_subsystem ? -1 : err[1]); + s->is_subsystem ? -1 : err[1], 0); if (s->is_subsystem) close(err[1]); } else { @@ -681,7 +681,7 @@ do_exec_pty(Session *s, const char *command) s->ptymaster = ptymaster; packet_set_interactive(1); if (compat20) { - session_set_fds(s, ptyfd, fdout, -1); + session_set_fds(s, ptyfd, fdout, -1, 1); } else { server_loop(pid, ptyfd, fdout, -1); /* server_loop _has_ closed ptyfd and fdout. */ @@ -1883,7 +1883,7 @@ session_input_channel_req(Channel *c, const char *rtype) } void -session_set_fds(Session *s, int fdin, int fdout, int fderr) +session_set_fds(Session *s, int fdin, int fdout, int fderr, int isatty) { if (!compat20) fatal("session_set_fds: called for proto != 2.0"); @@ -1896,8 +1896,7 @@ session_set_fds(Session *s, int fdin, int fdout, int fderr) channel_set_fds(s->chanid, fdout, fdin, fderr, fderr == -1 ? CHAN_EXTENDED_IGNORE : CHAN_EXTENDED_READ, - 1, - CHAN_SES_WINDOW_DEFAULT); + 1, isatty, CHAN_SES_WINDOW_DEFAULT); } /* |