- dtucker@cvs.openbsd.org 2013/06/07 15:37:52
[channels.c channels.h clientloop.c] Add an "ABANDONED" channel state and use for mux sessions that are disconnected via the ~. escape sequence. Channels in this state will be able to close if the server responds, but do not count as active channels. This means that if you ~. all of the mux clients when using ControlPersist on a broken network, the backgrounded mux master will exit when the Control Persist time expires rather than hanging around indefinitely. bz#1917, also reported and tested by tedu@. ok djm@ markus@.
This commit is contained in:
parent
ae133d4b31
commit
36187093ea
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
20130610
|
||||||
|
- (djm) OpenBSD CVS Sync
|
||||||
|
- dtucker@cvs.openbsd.org 2013/06/07 15:37:52
|
||||||
|
[channels.c channels.h clientloop.c]
|
||||||
|
Add an "ABANDONED" channel state and use for mux sessions that are
|
||||||
|
disconnected via the ~. escape sequence. Channels in this state will
|
||||||
|
be able to close if the server responds, but do not count as active channels.
|
||||||
|
This means that if you ~. all of the mux clients when using ControlPersist
|
||||||
|
on a broken network, the backgrounded mux master will exit when the
|
||||||
|
Control Persist time expires rather than hanging around indefinitely.
|
||||||
|
bz#1917, also reported and tested by tedu@. ok djm@ markus@.
|
||||||
|
|
||||||
20130605
|
20130605
|
||||||
- (dtucker) [myproposal.h] Enable sha256 kex methods based on the presence of
|
- (dtucker) [myproposal.h] Enable sha256 kex methods based on the presence of
|
||||||
the necessary functions, not from the openssl version.
|
the necessary functions, not from the openssl version.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: channels.c,v 1.322 2013/06/01 13:15:51 dtucker Exp $ */
|
/* $OpenBSD: channels.c,v 1.323 2013/06/07 15:37:52 dtucker Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -213,6 +213,7 @@ channel_lookup(int id)
|
||||||
case SSH_CHANNEL_OPEN:
|
case SSH_CHANNEL_OPEN:
|
||||||
case SSH_CHANNEL_INPUT_DRAINING:
|
case SSH_CHANNEL_INPUT_DRAINING:
|
||||||
case SSH_CHANNEL_OUTPUT_DRAINING:
|
case SSH_CHANNEL_OUTPUT_DRAINING:
|
||||||
|
case SSH_CHANNEL_ABANDONED:
|
||||||
return (c);
|
return (c);
|
||||||
}
|
}
|
||||||
logit("Non-public channel %d, type %d.", id, c->type);
|
logit("Non-public channel %d, type %d.", id, c->type);
|
||||||
|
@ -530,6 +531,7 @@ channel_still_open(void)
|
||||||
case SSH_CHANNEL_DYNAMIC:
|
case SSH_CHANNEL_DYNAMIC:
|
||||||
case SSH_CHANNEL_CONNECTING:
|
case SSH_CHANNEL_CONNECTING:
|
||||||
case SSH_CHANNEL_ZOMBIE:
|
case SSH_CHANNEL_ZOMBIE:
|
||||||
|
case SSH_CHANNEL_ABANDONED:
|
||||||
continue;
|
continue;
|
||||||
case SSH_CHANNEL_LARVAL:
|
case SSH_CHANNEL_LARVAL:
|
||||||
if (!compat20)
|
if (!compat20)
|
||||||
|
@ -575,6 +577,7 @@ channel_find_open(void)
|
||||||
case SSH_CHANNEL_OPENING:
|
case SSH_CHANNEL_OPENING:
|
||||||
case SSH_CHANNEL_CONNECTING:
|
case SSH_CHANNEL_CONNECTING:
|
||||||
case SSH_CHANNEL_ZOMBIE:
|
case SSH_CHANNEL_ZOMBIE:
|
||||||
|
case SSH_CHANNEL_ABANDONED:
|
||||||
continue;
|
continue;
|
||||||
case SSH_CHANNEL_LARVAL:
|
case SSH_CHANNEL_LARVAL:
|
||||||
case SSH_CHANNEL_AUTH_SOCKET:
|
case SSH_CHANNEL_AUTH_SOCKET:
|
||||||
|
@ -622,6 +625,7 @@ channel_open_message(void)
|
||||||
case SSH_CHANNEL_CLOSED:
|
case SSH_CHANNEL_CLOSED:
|
||||||
case SSH_CHANNEL_AUTH_SOCKET:
|
case SSH_CHANNEL_AUTH_SOCKET:
|
||||||
case SSH_CHANNEL_ZOMBIE:
|
case SSH_CHANNEL_ZOMBIE:
|
||||||
|
case SSH_CHANNEL_ABANDONED:
|
||||||
case SSH_CHANNEL_MUX_CLIENT:
|
case SSH_CHANNEL_MUX_CLIENT:
|
||||||
case SSH_CHANNEL_MUX_LISTENER:
|
case SSH_CHANNEL_MUX_LISTENER:
|
||||||
continue;
|
continue;
|
||||||
|
@ -2491,7 +2495,7 @@ channel_input_close_confirmation(int type, u_int32_t seq, void *ctxt)
|
||||||
if (c == NULL)
|
if (c == NULL)
|
||||||
packet_disconnect("Received close confirmation for "
|
packet_disconnect("Received close confirmation for "
|
||||||
"out-of-range channel %d.", id);
|
"out-of-range channel %d.", id);
|
||||||
if (c->type != SSH_CHANNEL_CLOSED)
|
if (c->type != SSH_CHANNEL_CLOSED && c->type != SSH_CHANNEL_ABANDONED)
|
||||||
packet_disconnect("Received close confirmation for "
|
packet_disconnect("Received close confirmation for "
|
||||||
"non-closed channel %d (type %d).", id, c->type);
|
"non-closed channel %d (type %d).", id, c->type);
|
||||||
channel_free(c);
|
channel_free(c);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: channels.h,v 1.112 2013/06/02 21:01:51 dtucker Exp $ */
|
/* $OpenBSD: channels.h,v 1.113 2013/06/07 15:37:52 dtucker Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
|
@ -55,7 +55,8 @@
|
||||||
#define SSH_CHANNEL_ZOMBIE 14 /* Almost dead. */
|
#define SSH_CHANNEL_ZOMBIE 14 /* Almost dead. */
|
||||||
#define SSH_CHANNEL_MUX_LISTENER 15 /* Listener for mux conn. */
|
#define SSH_CHANNEL_MUX_LISTENER 15 /* Listener for mux conn. */
|
||||||
#define SSH_CHANNEL_MUX_CLIENT 16 /* Conn. to mux slave */
|
#define SSH_CHANNEL_MUX_CLIENT 16 /* Conn. to mux slave */
|
||||||
#define SSH_CHANNEL_MAX_TYPE 17
|
#define SSH_CHANNEL_ABANDONED 17 /* Abandoned session, eg mux */
|
||||||
|
#define SSH_CHANNEL_MAX_TYPE 18
|
||||||
|
|
||||||
#define CHANNEL_CANCEL_PORT_STATIC -1
|
#define CHANNEL_CANCEL_PORT_STATIC -1
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: clientloop.c,v 1.252 2013/06/02 23:36:29 dtucker Exp $ */
|
/* $OpenBSD: clientloop.c,v 1.253 2013/06/07 15:37:52 dtucker Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -1111,6 +1111,9 @@ process_escapes(Channel *c, Buffer *bin, Buffer *bout, Buffer *berr,
|
||||||
chan_write_failed(c);
|
chan_write_failed(c);
|
||||||
if (c->detach_user)
|
if (c->detach_user)
|
||||||
c->detach_user(c->self, NULL);
|
c->detach_user(c->self, NULL);
|
||||||
|
c->type = SSH_CHANNEL_ABANDONED;
|
||||||
|
buffer_clear(&c->input);
|
||||||
|
chan_ibuf_empty(c);
|
||||||
return 0;
|
return 0;
|
||||||
} else
|
} else
|
||||||
quit_pending = 1;
|
quit_pending = 1;
|
||||||
|
|
Loading…
Reference in New Issue