From 944c4f0bdaa12ac3c58b77ee866758958e708329 Mon Sep 17 00:00:00 2001 From: Ben Lindstrom Date: Tue, 18 Sep 2001 05:51:13 +0000 Subject: - markus@cvs.openbsd.org 2001/09/17 20:52:47 [channels.c channels.h clientloop.c] try to fix agent-forwarding-backconnection-bug, as seen on HPUX, for example; with Lutz.Jaenicke@aet.TU-Cottbus.DE, --- ChangeLog | 6 +++++- channels.c | 15 ++++++++++++++- channels.h | 3 ++- clientloop.c | 4 +++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index e6582c9a..cb863a24 100644 --- a/ChangeLog +++ b/ChangeLog @@ -26,6 +26,10 @@ - markus@cvs.openbsd.org 2001/09/17 20:50:22 [key.c ssh-keygen.c] better error handling if you try to export a bad key to ssh.com + - markus@cvs.openbsd.org 2001/09/17 20:52:47 + [channels.c channels.h clientloop.c] + try to fix agent-forwarding-backconnection-bug, as seen on HPUX, + for example; with Lutz.Jaenicke@aet.TU-Cottbus.DE, 20010917 - (djm) x11-ssh-askpass-1.2.4 in RPM spec, revert workarounds @@ -6486,4 +6490,4 @@ - Wrote replacements for strlcpy and mkdtemp - Released 1.0pre1 -$Id: ChangeLog,v 1.1536 2001/09/18 05:49:14 mouring Exp $ +$Id: ChangeLog,v 1.1537 2001/09/18 05:51:13 mouring Exp $ diff --git a/channels.c b/channels.c index 7bf127d9..bf11716b 100644 --- a/channels.c +++ b/channels.c @@ -39,7 +39,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: channels.c,v 1.132 2001/07/17 21:04:56 markus Exp $"); +RCSID("$OpenBSD: channels.c,v 1.133 2001/09/17 20:52:47 markus Exp $"); #include "ssh.h" #include "ssh1.h" @@ -260,6 +260,7 @@ channel_new(char *ctype, int type, int rfd, int wfd, int efd, c->cb_fn = NULL; c->cb_arg = NULL; c->cb_event = 0; + c->force_drain = 0; c->detach_user = NULL; c->input_filter = NULL; debug("channel %d: new [%s]", found, remote_name); @@ -874,6 +875,9 @@ static void channel_pre_x11_open(Channel *c, fd_set * readset, fd_set * writeset) { int ret = x11_open_helper(&c->output); + + /* c->force_drain = 1; */ + if (ret == 1) { c->type = SSH_CHANNEL_OPEN; if (compat20) @@ -1781,6 +1785,13 @@ channel_input_ieof(int type, int plen, void *ctxt) if (c == NULL) packet_disconnect("Received ieof for nonexistent channel %d.", id); chan_rcvd_ieof(c); + + /* XXX force input close */ + if (c->force_drain) { + debug("channel %d: FORCE input drain", c->self); + c->istate = CHAN_INPUT_WAIT_DRAIN; + } + } void @@ -2669,6 +2680,7 @@ x11_input_open(int type, int plen, void *ctxt) close(sock); } else { c->remote_id = remote_id; + c->force_drain = 1; } } if (c == NULL) { @@ -2931,6 +2943,7 @@ auth_input_open_request(int type, int plen, void *ctxt) close(sock); } else { c->remote_id = remote_id; + c->force_drain = 1; } } if (c == NULL) { diff --git a/channels.h b/channels.h index 2ee1496c..a1300483 100644 --- a/channels.h +++ b/channels.h @@ -32,7 +32,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* RCSID("$OpenBSD: channels.h,v 1.45 2001/07/17 21:04:57 markus Exp $"); */ +/* RCSID("$OpenBSD: channels.h,v 1.46 2001/09/17 20:52:47 markus Exp $"); */ #ifndef CHANNEL_H #define CHANNEL_H @@ -77,6 +77,7 @@ struct Channel { int efd; /* extended fd */ int sock; /* sock fd */ int isatty; /* rfd is a tty */ + int force_drain; /* force close on iEOF */ Buffer input; /* data read from socket, to be sent over * encrypted connection */ Buffer output; /* data received over encrypted connection for diff --git a/clientloop.c b/clientloop.c index 41aff835..e6da67d5 100644 --- a/clientloop.c +++ b/clientloop.c @@ -59,7 +59,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: clientloop.c,v 1.81 2001/07/17 21:04:57 markus Exp $"); +RCSID("$OpenBSD: clientloop.c,v 1.82 2001/09/17 20:52:47 markus Exp $"); #include "ssh.h" #include "ssh1.h" @@ -1111,6 +1111,7 @@ client_request_x11(const char *request_type, int rchan) error("client_request_x11: channel_new failed"); close(sock); } + c->force_drain = 1; return c; } @@ -1136,6 +1137,7 @@ client_request_agent(const char *request_type, int rchan) error("client_request_agent: channel_new failed"); close(sock); } + c->force_drain = 1; return c; } -- cgit v1.2.3