From b872f7f08d97fc40977b78a97cc9b1b2f01e3606 Mon Sep 17 00:00:00 2001 From: djm Date: Tue, 13 Dec 2005 08:33:57 +0000 Subject: [PATCH] - 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@ --- ChangeLog | 4 ++++ channels.c | 45 ++++++++++++++++++++++++++++++++++++--------- channels.h | 3 ++- session.c | 4 ++-- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9c167b86..1ab1d907 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/channels.c b/channels.c index b4fd89f9..e73dc247 100644 --- a/channels.c +++ b/channels.c @@ -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,22 +142,50 @@ 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(); diff --git a/channels.h b/channels.h index 743a2065..7990fe14 100644 --- a/channels.h +++ b/channels.h @@ -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 @@ -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); diff --git a/session.c b/session.c index 7863aa15..8d186dd7 100644 --- a/session.c +++ b/session.c @@ -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 */ -- 2.45.1