upstream: include a little more information about the status and

disposition of channel's extended (stderr) fd; makes debugging some things a
bit easier. No behaviour change.

OpenBSD-Commit-ID: 483eb6467dc7d5dbca8eb109c453e7a43075f7ce
This commit is contained in:
djm@openbsd.org 2018-10-04 00:10:11 +00:00 committed by Damien Miller
parent 2d1428b11c
commit f1dd179e12
4 changed files with 64 additions and 29 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: channels.c,v 1.384 2018/07/27 12:03:17 markus Exp $ */
/* $OpenBSD: channels.c,v 1.385 2018/10/04 00:10:11 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@ -799,6 +799,25 @@ channel_find_open(struct ssh *ssh)
return -1;
}
/* Returns the state of the channel's extended usage flag */
const char *
channel_format_extended_usage(const Channel *c)
{
if (c->efd == -1)
return "closed";
switch (c->extended_usage) {
case CHAN_EXTENDED_WRITE:
return "write";
case CHAN_EXTENDED_READ:
return "read";
case CHAN_EXTENDED_IGNORE:
return "ignore";
default:
return "UNKNOWN";
}
}
/*
* Returns a message describing the currently open forwarded connections,
* suitable for sending to the client. The message contains crlf pairs for
@ -845,13 +864,16 @@ channel_open_message(struct ssh *ssh)
case SSH_CHANNEL_MUX_PROXY:
case SSH_CHANNEL_MUX_CLIENT:
if ((r = sshbuf_putf(buf, " #%d %.300s "
"(t%d %s%u i%u/%zu o%u/%zu fd %d/%d cc %d)\r\n",
"(t%d %s%u i%u/%zu o%u/%zu "
"fd %d/%d/%d [%s] sock %d cc %d)\r\n",
c->self, c->remote_name,
c->type,
c->have_remote_id ? "r" : "nr", c->remote_id,
c->istate, sshbuf_len(c->input),
c->ostate, sshbuf_len(c->output),
c->rfd, c->wfd, c->ctl_chan)) != 0)
c->rfd, c->wfd, c->efd,
channel_format_extended_usage(c),
c->sock, c->ctl_chan)) != 0)
fatal("%s: sshbuf_putf: %s",
__func__, ssh_err(r));
continue;
@ -2352,6 +2374,7 @@ channel_garbage_collect(struct ssh *ssh, Channel *c)
if (c->detach_user != NULL) {
if (!chan_is_dead(ssh, c, c->detach_close))
return;
debug2("channel %d: gc: notify user", c->self);
c->detach_user(ssh, c->self, NULL);
/* if we still have a callback */

View File

@ -1,4 +1,4 @@
/* $OpenBSD: channels.h,v 1.131 2018/06/06 18:22:41 djm Exp $ */
/* $OpenBSD: channels.h,v 1.132 2018/10/04 00:10:11 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@ -285,6 +285,7 @@ void channel_output_poll(struct ssh *);
int channel_not_very_much_buffered_data(struct ssh *);
void channel_close_all(struct ssh *);
int channel_still_open(struct ssh *);
const char *channel_format_extended_usage(const Channel *);
char *channel_open_message(struct ssh *);
int channel_find_open(struct ssh *);

52
nchan.c
View File

@ -1,4 +1,4 @@
/* $OpenBSD: nchan.c,v 1.67 2017/09/12 06:35:32 djm Exp $ */
/* $OpenBSD: nchan.c,v 1.68 2018/10/04 00:10:11 djm Exp $ */
/*
* Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved.
*
@ -373,17 +373,23 @@ chan_shutdown_write(struct ssh *ssh, Channel *c)
if (c->type == SSH_CHANNEL_LARVAL)
return;
/* shutdown failure is allowed if write failed already */
debug2("channel %d: close_write", c->self);
debug2("channel %d: %s (i%d o%d sock %d wfd %d efd %d [%s])",
c->self, __func__, c->istate, c->ostate, c->sock, c->wfd, c->efd,
channel_format_extended_usage(c));
if (c->sock != -1) {
if (shutdown(c->sock, SHUT_WR) < 0)
debug2("channel %d: chan_shutdown_write: "
"shutdown() failed for fd %d: %.100s",
c->self, c->sock, strerror(errno));
if (shutdown(c->sock, SHUT_WR) < 0) {
debug2("channel %d: %s: shutdown() failed for "
"fd %d [i%d o%d]: %.100s", c->self, __func__,
c->sock, c->istate, c->ostate,
strerror(errno));
}
} else {
if (channel_close_fd(ssh, &c->wfd) < 0)
logit("channel %d: chan_shutdown_write: "
"close() failed for fd %d: %.100s",
c->self, c->wfd, strerror(errno));
if (channel_close_fd(ssh, &c->wfd) < 0) {
logit("channel %d: %s: close() failed for "
"fd %d [i%d o%d]: %.100s",
c->self, __func__, c->wfd, c->istate, c->ostate,
strerror(errno));
}
}
}
@ -392,23 +398,27 @@ chan_shutdown_read(struct ssh *ssh, Channel *c)
{
if (c->type == SSH_CHANNEL_LARVAL)
return;
debug2("channel %d: close_read", c->self);
debug2("channel %d: %s (i%d o%d sock %d wfd %d efd %d [%s])",
c->self, __func__, c->istate, c->ostate, c->sock, c->rfd, c->efd,
channel_format_extended_usage(c));
if (c->sock != -1) {
/*
* shutdown(sock, SHUT_READ) may return ENOTCONN if the
* write side has been closed already. (bug on Linux)
* HP-UX may return ENOTCONN also.
*/
if (shutdown(c->sock, SHUT_RD) < 0
&& errno != ENOTCONN)
error("channel %d: chan_shutdown_read: "
"shutdown() failed for fd %d [i%d o%d]: %.100s",
c->self, c->sock, c->istate, c->ostate,
strerror(errno));
if (shutdown(c->sock, SHUT_RD) < 0 && errno != ENOTCONN) {
error("channel %d: %s: shutdown() failed for "
"fd %d [i%d o%d]: %.100s",
c->self, __func__, c->sock, c->istate, c->ostate,
strerror(errno));
}
} else {
if (channel_close_fd(ssh, &c->rfd) < 0)
logit("channel %d: chan_shutdown_read: "
"close() failed for fd %d: %.100s",
c->self, c->rfd, strerror(errno));
if (channel_close_fd(ssh, &c->rfd) < 0) {
logit("channel %d: %s: close() failed for "
"fd %d [i%d o%d]: %.100s",
c->self, __func__, c->rfd, c->istate, c->ostate,
strerror(errno));
}
}
}

View File

@ -1,4 +1,4 @@
/* $OpenBSD: session.c,v 1.306 2018/10/02 12:40:07 djm Exp $ */
/* $OpenBSD: session.c,v 1.307 2018/10/04 00:10:11 djm Exp $ */
/*
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved
@ -2262,13 +2262,13 @@ void
session_pty_cleanup2(Session *s)
{
if (s == NULL) {
error("session_pty_cleanup: no session");
error("%s: no session", __func__);
return;
}
if (s->ttyfd == -1)
return;
debug("session_pty_cleanup: session %d release %s", s->self, s->tty);
debug("%s: session %d release %s", __func__, s->self, s->tty);
/* Record that the user has logged out. */
if (s->pid != 0)
@ -2479,7 +2479,8 @@ session_close_by_channel(struct ssh *ssh, int id, void *arg)
}
debug("%s: channel %d child %ld", __func__, id, (long)s->pid);
if (s->pid != 0) {
debug("%s: channel %d: has child", __func__, id);
debug("%s: channel %d: has child, ttyfd %d",
__func__, id, s->ttyfd);
/*
* delay detach of session, but release pty, since
* the fd's to the child are already closed