diff options
author | Damien Miller <djm@mindrot.org> | 2005-12-13 19:33:57 +1100 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2005-12-13 19:33:57 +1100 |
commit | d47c62a714c2c3e6a564aa498e3ef0445c9f9ea3 (patch) | |
tree | cfbc1602e7f27092ada0ff160f8985e1cb813c6d | |
parent | 7746c391b105dd9b1a348b816ca0150bf701e1e2 (diff) |
- markus@cvs.openbsd.org 2005/12/12 13:46:18
[channels.c channels.h session.c]
make sure protocol messages for internal channels are ignored.
allow adjust messages for non-open channels; with and ok djm@
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | channels.c | 45 | ||||
-rw-r--r-- | channels.h | 3 | ||||
-rw-r--r-- | session.c | 4 |
4 files changed, 45 insertions, 13 deletions
@@ -51,6 +51,10 @@ - jmc@cvs.openbsd.org 2005/12/08 21:37:50 [ssh_config.5] new sentence, new line; + - markus@cvs.openbsd.org 2005/12/12 13:46:18 + [channels.c channels.h session.c] + make sure protocol messages for internal channels are ignored. + allow adjust messages for non-open channels; with and ok djm@ 20051201 - (djm) [envpass.sh] Remove regress script that was accidentally committed @@ -3443,4 +3447,4 @@ - (djm) Trim deprecated options from INSTALL. Mention UsePAM - (djm) Fix quote handling in sftp; Patch from admorten AT umich.edu -$Id: ChangeLog,v 1.4025 2005/12/13 08:33:37 djm Exp $ +$Id: ChangeLog,v 1.4026 2005/12/13 08:33:57 djm Exp $ @@ -39,7 +39,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: channels.c,v 1.228 2005/12/06 22:38:27 reyk Exp $"); +RCSID("$OpenBSD: channels.c,v 1.229 2005/12/12 13:46:18 markus Exp $"); #include "ssh.h" #include "ssh1.h" @@ -142,23 +142,51 @@ static void port_open_helper(Channel *c, char *rtype); /* -- channel core */ Channel * -channel_lookup(int id) +channel_by_id(int id) { Channel *c; if (id < 0 || (u_int)id >= channels_alloc) { - logit("channel_lookup: %d: bad id", id); + logit("channel_by_id: %d: bad id", id); return NULL; } c = channels[id]; if (c == NULL) { - logit("channel_lookup: %d: bad id: channel free", id); + logit("channel_by_id: %d: bad id: channel free", id); return NULL; } return c; } /* + * Returns the channel if it is allowed to receive protocol messages. + * Private channels, like listening sockets, may not receive messages. + */ +Channel * +channel_lookup(int id) +{ + Channel *c; + + if ((c = channel_by_id(id)) == NULL) + return (NULL); + + switch(c->type) { + case SSH_CHANNEL_X11_OPEN: + case SSH_CHANNEL_LARVAL: + case SSH_CHANNEL_CONNECTING: + case SSH_CHANNEL_DYNAMIC: + case SSH_CHANNEL_OPENING: + case SSH_CHANNEL_OPEN: + case SSH_CHANNEL_INPUT_DRAINING: + case SSH_CHANNEL_OUTPUT_DRAINING: + return (c); + break; + } + logit("Non-public channel %d, type %d.", id, c->type); + return (NULL); +} + +/* * Register filedescriptors for a channel, used when allocating a channel or * when the channel consumer/producer is ready, e.g. shell exec'd */ @@ -631,7 +659,7 @@ channel_register_confirm(int id, channel_callback_fn *fn, void *ctx) void channel_register_cleanup(int id, channel_callback_fn *fn, int do_close) { - Channel *c = channel_lookup(id); + Channel *c = channel_by_id(id); if (c == NULL) { logit("channel_register_cleanup: %d: bad id", id); @@ -643,7 +671,7 @@ channel_register_cleanup(int id, channel_callback_fn *fn, int do_close) void channel_cancel_cleanup(int id) { - Channel *c = channel_lookup(id); + Channel *c = channel_by_id(id); if (c == NULL) { logit("channel_cancel_cleanup: %d: bad id", id); @@ -2183,9 +2211,8 @@ channel_input_window_adjust(int type, u_int32_t seq, void *ctxt) id = packet_get_int(); c = channel_lookup(id); - if (c == NULL || c->type != SSH_CHANNEL_OPEN) { - logit("Received window adjust for " - "non-open channel %d.", id); + if (c == NULL) { + logit("Received window adjust for non-open channel %d.", id); return; } adjust = packet_get_int(); @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.h,v 1.81 2005/12/06 22:38:27 reyk Exp $ */ +/* $OpenBSD: channels.h,v 1.82 2005/12/12 13:46:18 markus Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> @@ -157,6 +157,7 @@ struct Channel { /* channel management */ +Channel *channel_by_id(int); Channel *channel_lookup(int); Channel *channel_new(char *, int, int, int, int, u_int, u_int, int, char *, int); void channel_set_fds(int, int, int, int, int, int, u_int); @@ -33,7 +33,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: session.c,v 1.188 2005/10/30 08:52:17 djm Exp $"); +RCSID("$OpenBSD: session.c,v 1.189 2005/12/12 13:46:18 markus Exp $"); #include "ssh.h" #include "ssh1.h" @@ -2101,7 +2101,7 @@ session_close_x11(int id) { Channel *c; - if ((c = channel_lookup(id)) == NULL) { + if ((c = channel_by_id(id)) == NULL) { debug("session_close_x11: x11 channel %d missing", id); } else { /* Detach X11 listener */ |