diff --git a/agentf.c b/agentf.c index 69ede15e..3fab01a9 100644 --- a/agentf.c +++ b/agentf.c @@ -155,7 +155,7 @@ static const struct ChannelVtable agentf_channelvt = { agentf_send_eof, agentf_set_input_wanted, agentf_log_close_msg, - chan_no_eager_close, + chan_default_want_close, chan_no_exit_status, chan_no_exit_signal, chan_no_exit_signal_numeric, diff --git a/mainchan.c b/mainchan.c index 524a0fc8..1ee731a6 100644 --- a/mainchan.c +++ b/mainchan.c @@ -33,7 +33,7 @@ static const struct ChannelVtable mainchan_channelvt = { mainchan_send_eof, mainchan_set_input_wanted, mainchan_log_close_msg, - chan_no_eager_close, + chan_default_want_close, mainchan_rcvd_exit_status, mainchan_rcvd_exit_signal, mainchan_rcvd_exit_signal_numeric, diff --git a/portfwd.c b/portfwd.c index dbba3889..6d8d1153 100644 --- a/portfwd.c +++ b/portfwd.c @@ -450,7 +450,7 @@ static const struct ChannelVtable PortForwarding_channelvt = { pfd_send_eof, pfd_set_input_wanted, pfd_log_close_msg, - chan_no_eager_close, + chan_default_want_close, chan_no_exit_status, chan_no_exit_signal, chan_no_exit_signal_numeric, diff --git a/ssh2connection.c b/ssh2connection.c index 52b8e0f8..e6e2fd14 100644 --- a/ssh2connection.c +++ b/ssh2connection.c @@ -1153,9 +1153,8 @@ static void ssh2_channel_check_close(struct ssh2_channel *c) return; } - if ((!((CLOSES_SENT_EOF | CLOSES_RCVD_EOF) & ~c->closes) || - chan_want_close(c->chan, (c->closes & CLOSES_SENT_EOF), - (c->closes & CLOSES_RCVD_EOF))) && + if (chan_want_close(c->chan, (c->closes & CLOSES_SENT_EOF), + (c->closes & CLOSES_RCVD_EOF)) && !c->chanreq_head && !(c->closes & CLOSES_SENT_CLOSE)) { /* diff --git a/sshchan.h b/sshchan.h index 3b221481..63f13136 100644 --- a/sshchan.h +++ b/sshchan.h @@ -75,7 +75,7 @@ void chan_remotely_opened_failure(Channel *chan, const char *errtext); /* want_close for any channel that wants the default behaviour of not * closing until both directions have had an EOF */ -int chan_no_eager_close(Channel *, int, int); +int chan_default_want_close(Channel *, int, int); /* default implementations that refuse all the channel requests */ int chan_no_exit_status(Channel *, int); diff --git a/sshcommon.c b/sshcommon.c index ec206c60..48eeff1b 100644 --- a/sshcommon.c +++ b/sshcommon.c @@ -339,9 +339,14 @@ void chan_remotely_opened_failure(Channel *chan, const char *errtext) assert(0 && "this channel type should never receive OPEN_FAILURE"); } -int chan_no_eager_close(Channel *chan, int sent_local_eof, int rcvd_remote_eof) +int chan_default_want_close( + Channel *chan, int sent_local_eof, int rcvd_remote_eof) { - return FALSE; /* default: never proactively ask for a close */ + /* + * Default close policy: we start initiating the CHANNEL_CLOSE + * procedure as soon as both sides of the channel have seen EOF. + */ + return sent_local_eof && rcvd_remote_eof; } int chan_no_exit_status(Channel *chan, int status) diff --git a/unix/uxpgnt.c b/unix/uxpgnt.c index 55e7981a..a0c48ca3 100644 --- a/unix/uxpgnt.c +++ b/unix/uxpgnt.c @@ -124,7 +124,7 @@ static int time_to_die = FALSE; * forwarding too. */ void chan_remotely_opened_confirmation(Channel *chan) { } void chan_remotely_opened_failure(Channel *chan, const char *err) { } -int chan_no_eager_close(Channel *chan, int s, int r) { return FALSE; } +int chan_default_want_close(Channel *chan, int s, int r) { return FALSE; } int chan_no_exit_status(Channel *ch, int s) { return FALSE; } int chan_no_exit_signal(Channel *ch, ptrlen s, int c, ptrlen m) { return FALSE; } diff --git a/x11fwd.c b/x11fwd.c index 44c9df1e..8e306f42 100644 --- a/x11fwd.c +++ b/x11fwd.c @@ -730,7 +730,7 @@ static const struct ChannelVtable X11Connection_channelvt = { x11_send_eof, x11_set_input_wanted, x11_log_close_msg, - chan_no_eager_close, + chan_default_want_close, chan_no_exit_status, chan_no_exit_signal, chan_no_exit_signal_numeric,