diff options
author | Damien Miller <djm@mindrot.org> | 2010-01-28 06:26:59 +1100 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2010-01-28 06:26:59 +1100 |
commit | a21cdfac2fd89360b5c60152bda60b4150ad35fc (patch) | |
tree | 98e78afd2d0aa06b6872814c7ca1dc9c688f67ee /mux.c | |
parent | 45a81a0e18fe988f20794622390146c7e3975d6f (diff) |
- djm@cvs.openbsd.org 2010/01/27 13:26:17
[mux.c]
fix bug introduced in mux rewrite:
In a mux master, when a socket to a mux slave closes before its server
session (as may occur when the slave has been signalled), gracefully
close the server session rather than deleting its channel immediately.
A server may have more messages on that channel to send (e.g. an exit
message) that will fatal() the client if they are sent to a channel that
has been prematurely deleted.
spotted by imorgan AT nas.nasa.gov
Diffstat (limited to 'mux.c')
-rw-r--r-- | mux.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: mux.c,v 1.11 2010/01/26 02:15:20 djm Exp $ */ | 1 | /* $OpenBSD: mux.c,v 1.12 2010/01/27 13:26:17 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2002-2008 Damien Miller <djm@openbsd.org> | 3 | * Copyright (c) 2002-2008 Damien Miller <djm@openbsd.org> |
4 | * | 4 | * |
@@ -210,7 +210,13 @@ mux_master_control_cleanup_cb(int cid, void *unused) | |||
210 | __func__, c->self, c->remote_id); | 210 | __func__, c->self, c->remote_id); |
211 | c->remote_id = -1; | 211 | c->remote_id = -1; |
212 | sc->ctl_chan = -1; | 212 | sc->ctl_chan = -1; |
213 | chan_mark_dead(sc); | 213 | if (sc->type != SSH_CHANNEL_OPEN) { |
214 | debug2("%s: channel %d: not open", __func__, sc->self); | ||
215 | chan_mark_dead(c); | ||
216 | } else { | ||
217 | chan_read_failed(sc); | ||
218 | chan_write_failed(sc); | ||
219 | } | ||
214 | } | 220 | } |
215 | channel_cancel_cleanup(c->self); | 221 | channel_cancel_cleanup(c->self); |
216 | } | 222 | } |