restore the blocking mode on standard output - upstream

Resolves: rhbz#1942901
This commit is contained in:
Dmitry Belyavskiy 2021-06-21 13:12:47 +02:00
parent 2f2c30932e
commit d761d9a626
2 changed files with 222 additions and 140 deletions

View File

@ -1,221 +1,300 @@
diff -up openssh-8.6p1/channels.c.restore-nonblock openssh-8.6p1/channels.c diff --git a/channels.c b/channels.c
--- openssh-8.6p1/channels.c.restore-nonblock 2021-05-10 10:55:46.981156096 +0200 index 32d1f617..0024f751 100644
+++ openssh-8.6p1/channels.c 2021-05-10 11:05:14.674641053 +0200 --- a/channels.c
@@ -298,32 +298,38 @@ channel_lookup(struct ssh *ssh, int id) +++ b/channels.c
} @@ -333,7 +333,27 @@ channel_register_fds(struct ssh *ssh, Channel *c, int rfd, int wfd, int efd,
/*
- * Register filedescriptors for a channel, used when allocating a channel or
- * when the channel consumer/producer is ready, e.g. shell exec'd
+ * Register a filedescriptor.
*/
static void
-channel_register_fds(struct ssh *ssh, Channel *c, int rfd, int wfd, int efd,
- int extusage, int nonblock, int is_tty)
+channel_register_fd(struct ssh *ssh, int fd, int nonblock)
{
struct ssh_channels *sc = ssh->chanctxt;
/* Update the maximum file descriptor value. */
- sc->channel_max_fd = MAXIMUM(sc->channel_max_fd, rfd);
- sc->channel_max_fd = MAXIMUM(sc->channel_max_fd, wfd);
- sc->channel_max_fd = MAXIMUM(sc->channel_max_fd, efd);
-
- if (rfd != -1)
- fcntl(rfd, F_SETFD, FD_CLOEXEC);
- if (wfd != -1 && wfd != rfd)
- fcntl(wfd, F_SETFD, FD_CLOEXEC);
- if (efd != -1 && efd != rfd && efd != wfd)
- fcntl(efd, F_SETFD, FD_CLOEXEC);
+ sc->channel_max_fd = MAXIMUM(sc->channel_max_fd, fd);
+
+ if (fd != -1)
+ fcntl(fd, F_SETFD, FD_CLOEXEC);
+ /* enable nonblocking mode */
+ if (nonblock && fd != -1 && !isatty(fd))
+ set_nonblock(fd);
+}
+
+/*
+ * Register filedescriptors for a channel, used when allocating a channel or
+ * when the channel consumer/producer is ready, e.g. shell exec'd
+ */
+static void
+channel_register_fds(struct ssh *ssh, Channel *c, int rfd, int wfd, int efd,
+ int extusage, int nonblock, int is_tty)
+{
c->rfd = rfd;
c->wfd = wfd;
c->sock = (rfd == wfd) ? rfd : -1;
c->efd = efd;
c->extended_usage = extusage;
+ c->nonblock = 0;
if ((c->isatty = is_tty) != 0)
debug2("channel %d: rfd %d isatty", c->self, c->rfd);
@@ -332,14 +338,20 @@ channel_register_fds(struct ssh *ssh, Ch
c->wfd_isatty = is_tty || isatty(c->wfd);
#endif #endif
- /* enable nonblocking mode */ /* enable nonblocking mode */
- if (nonblock) { - if (nonblock) {
- if (rfd != -1) + c->restore_block = 0;
- set_nonblock(rfd); + if (nonblock == CHANNEL_NONBLOCK_STDIO) {
- if (wfd != -1) + /*
- set_nonblock(wfd); + * Special handling for stdio file descriptors: do not set
- if (efd != -1) + * non-blocking mode if they are TTYs. Otherwise prepare to
- set_nonblock(efd); + * restore their blocking state on exit to avoid interfering
+ if (rfd != -1) { + * with other programs that follow.
+ if ((fcntl(rfd, F_GETFL) & O_NONBLOCK) == 0) + */
+ c->nonblock |= NEED_RESTORE_STDIN_NONBLOCK; + if (rfd != -1 && !isatty(rfd) && fcntl(rfd, F_GETFL) == 0) {
+ channel_register_fd(ssh, rfd, nonblock); + c->restore_block |= CHANNEL_RESTORE_RFD;
+ set_nonblock(rfd);
+ } + }
+ if (wfd != -1 && wfd != rfd) { + if (wfd != -1 && !isatty(wfd) && fcntl(wfd, F_GETFL) == 0) {
+ if ((fcntl(wfd, F_GETFL) & O_NONBLOCK) == 0) + c->restore_block |= CHANNEL_RESTORE_WFD;
+ c->nonblock |= NEED_RESTORE_STDOUT_NONBLOCK; + set_nonblock(wfd);
+ channel_register_fd(ssh, wfd, nonblock);
+ } + }
+ if (efd != -1 && efd != rfd && efd != wfd) { + if (efd != -1 && !isatty(efd) && fcntl(efd, F_GETFL) == 0) {
+ if ((fcntl(efd, F_GETFL) & O_NONBLOCK) == 0) + c->restore_block |= CHANNEL_RESTORE_EFD;
+ c->nonblock |= NEED_RESTORE_STDERR_NONBLOCK; + set_nonblock(efd);
+ channel_register_fd(ssh, efd, nonblock); + }
} + } else if (nonblock) {
} if (rfd != -1)
set_nonblock(rfd);
@@ -422,11 +434,15 @@ channel_find_maxfd(struct ssh_channels * if (wfd != -1)
@@ -422,17 +442,23 @@ channel_find_maxfd(struct ssh_channels *sc)
} }
int int
-channel_close_fd(struct ssh *ssh, int *fdp) -channel_close_fd(struct ssh *ssh, int *fdp)
+channel_close_fd(struct ssh *ssh, int *fdp, int nonblock) +channel_close_fd(struct ssh *ssh, Channel *c, int *fdp)
{ {
struct ssh_channels *sc = ssh->chanctxt; struct ssh_channels *sc = ssh->chanctxt;
int ret = 0, fd = *fdp; - int ret = 0, fd = *fdp;
+ int ret, fd = *fdp;
+ /* As the fd is duped, restoring the block mode - if (fd != -1) {
+ * affects the original fd */ - ret = close(fd);
+ if (nonblock && fd != -1 && !isatty(fd)) - *fdp = -1;
+ unset_nonblock(fd); - if (fd == sc->channel_max_fd)
if (fd != -1) { - channel_find_maxfd(sc);
ret = close(fd); - }
*fdp = -1; + if (fd == -1)
@@ -442,13 +458,13 @@ channel_close_fds(struct ssh *ssh, Chann + return 0;
+
+ if ((*fdp == c->rfd && (c->restore_block & CHANNEL_RESTORE_RFD) != 0) ||
+ (*fdp == c->wfd && (c->restore_block & CHANNEL_RESTORE_WFD) != 0) ||
+ (*fdp == c->efd && (c->restore_block & CHANNEL_RESTORE_EFD) != 0))
+ (void)fcntl(*fdp, F_SETFL, 0); /* restore blocking */
+
+ ret = close(fd);
+ *fdp = -1;
+ if (fd == sc->channel_max_fd)
+ channel_find_maxfd(sc);
return ret;
}
@@ -442,13 +468,13 @@ channel_close_fds(struct ssh *ssh, Channel *c)
{ {
int sock = c->sock, rfd = c->rfd, wfd = c->wfd, efd = c->efd; int sock = c->sock, rfd = c->rfd, wfd = c->wfd, efd = c->efd;
- channel_close_fd(ssh, &c->sock); - channel_close_fd(ssh, &c->sock);
+ channel_close_fd(ssh, &c->sock, 0); + channel_close_fd(ssh, c, &c->sock);
if (rfd != sock) if (rfd != sock)
- channel_close_fd(ssh, &c->rfd); - channel_close_fd(ssh, &c->rfd);
+ channel_close_fd(ssh, &c->rfd, c->nonblock & NEED_RESTORE_STDIN_NONBLOCK); + channel_close_fd(ssh, c, &c->rfd);
if (wfd != sock && wfd != rfd) if (wfd != sock && wfd != rfd)
- channel_close_fd(ssh, &c->wfd); - channel_close_fd(ssh, &c->wfd);
+ channel_close_fd(ssh, &c->wfd, c->nonblock & NEED_RESTORE_STDOUT_NONBLOCK); + channel_close_fd(ssh, c, &c->wfd);
if (efd != sock && efd != rfd && efd != wfd) if (efd != sock && efd != rfd && efd != wfd)
- channel_close_fd(ssh, &c->efd); - channel_close_fd(ssh, &c->efd);
+ channel_close_fd(ssh, &c->efd, c->nonblock & NEED_RESTORE_STDERR_NONBLOCK); + channel_close_fd(ssh, c, &c->efd);
} }
static void static void
@@ -702,7 +718,7 @@ channel_stop_listening(struct ssh *ssh) @@ -702,7 +728,7 @@ channel_stop_listening(struct ssh *ssh)
case SSH_CHANNEL_X11_LISTENER: case SSH_CHANNEL_X11_LISTENER:
case SSH_CHANNEL_UNIX_LISTENER: case SSH_CHANNEL_UNIX_LISTENER:
case SSH_CHANNEL_RUNIX_LISTENER: case SSH_CHANNEL_RUNIX_LISTENER:
- channel_close_fd(ssh, &c->sock); - channel_close_fd(ssh, &c->sock);
+ channel_close_fd(ssh, &c->sock, 0); + channel_close_fd(ssh, c, &c->sock);
channel_free(ssh, c); channel_free(ssh, c);
break; break;
} }
@@ -1649,7 +1665,7 @@ channel_post_x11_listener(struct ssh *ss @@ -1491,7 +1517,8 @@ channel_decode_socks5(Channel *c, struct sshbuf *input, struct sshbuf *output)
Channel *
channel_connect_stdio_fwd(struct ssh *ssh,
- const char *host_to_connect, u_short port_to_connect, int in, int out)
+ const char *host_to_connect, u_short port_to_connect,
+ int in, int out, int nonblock)
{
Channel *c;
@@ -1499,7 +1526,7 @@ channel_connect_stdio_fwd(struct ssh *ssh,
c = channel_new(ssh, "stdio-forward", SSH_CHANNEL_OPENING, in, out,
-1, CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
- 0, "stdio-forward", /*nonblock*/0);
+ 0, "stdio-forward", nonblock);
c->path = xstrdup(host_to_connect);
c->host_port = port_to_connect;
@@ -1649,7 +1676,7 @@ channel_post_x11_listener(struct ssh *ssh, Channel *c,
if (c->single_connection) { if (c->single_connection) {
oerrno = errno; oerrno = errno;
debug2("single_connection: closing X11 listener."); debug2("single_connection: closing X11 listener.");
- channel_close_fd(ssh, &c->sock); - channel_close_fd(ssh, &c->sock);
+ channel_close_fd(ssh, &c->sock, 0); + channel_close_fd(ssh, c, &c->sock);
chan_mark_dead(ssh, c); chan_mark_dead(ssh, c);
errno = oerrno; errno = oerrno;
} }
@@ -2058,7 +2074,7 @@ channel_handle_efd_write(struct ssh *ssh @@ -2058,7 +2085,7 @@ channel_handle_efd_write(struct ssh *ssh, Channel *c,
return 1; return 1;
if (len <= 0) { if (len <= 0) {
debug2("channel %d: closing write-efd %d", c->self, c->efd); debug2("channel %d: closing write-efd %d", c->self, c->efd);
- channel_close_fd(ssh, &c->efd); - channel_close_fd(ssh, &c->efd);
+ channel_close_fd(ssh, &c->efd, c->nonblock & NEED_RESTORE_STDERR_NONBLOCK); + channel_close_fd(ssh, c, &c->efd);
} else { } else {
if ((r = sshbuf_consume(c->extended, len)) != 0) if ((r = sshbuf_consume(c->extended, len)) != 0)
fatal_fr(r, "channel %i: consume", c->self); fatal_fr(r, "channel %i: consume", c->self);
@@ -2087,7 +2103,7 @@ channel_handle_efd_read(struct ssh *ssh, @@ -2087,7 +2114,7 @@ channel_handle_efd_read(struct ssh *ssh, Channel *c,
return 1; return 1;
if (len <= 0) { if (len <= 0) {
debug2("channel %d: closing read-efd %d", c->self, c->efd); debug2("channel %d: closing read-efd %d", c->self, c->efd);
- channel_close_fd(ssh, &c->efd); - channel_close_fd(ssh, &c->efd);
+ channel_close_fd(ssh, &c->efd, c->nonblock & NEED_RESTORE_STDERR_NONBLOCK); + channel_close_fd(ssh, c, &c->efd);
} else if (c->extended_usage == CHAN_EXTENDED_IGNORE) } else if (c->extended_usage == CHAN_EXTENDED_IGNORE)
debug3("channel %d: discard efd", c->self); debug3("channel %d: discard efd", c->self);
else if ((r = sshbuf_put(c->extended, buf, len)) != 0) else if ((r = sshbuf_put(c->extended, buf, len)) != 0)
diff -up openssh-8.6p1/channels.h.restore-nonblock openssh-8.6p1/channels.h diff --git a/channels.h b/channels.h
--- openssh-8.6p1/channels.h.restore-nonblock 2021-05-10 10:55:46.942155788 +0200 index 378d987c..6bf86b00 100644
+++ openssh-8.6p1/channels.h 2021-05-10 11:01:41.123953937 +0200 --- a/channels.h
@@ -188,8 +188,15 @@ struct Channel { +++ b/channels.h
void *mux_ctx; @@ -63,6 +63,16 @@
int mux_pause;
int mux_downstream_id;
+
+ /* whether non-blocking is set to descriptors */
+ int nonblock;
};
+#define NEED_RESTORE_STDIN_NONBLOCK 1 #define CHANNEL_CANCEL_PORT_STATIC -1
+#define NEED_RESTORE_STDOUT_NONBLOCK 2
+#define NEED_RESTORE_STDERR_NONBLOCK 4 +/* nonblocking flags for channel_new */
+#define CHANNEL_NONBLOCK_LEAVE 0 /* don't modify non-blocking state */
+#define CHANNEL_NONBLOCK_SET 1 /* set non-blocking state */
+#define CHANNEL_NONBLOCK_STDIO 2 /* set non-blocking and restore on close */
+ +
#define CHAN_EXTENDED_IGNORE 0 +/* c->restore_block mask flags */
#define CHAN_EXTENDED_READ 1 +#define CHANNEL_RESTORE_RFD 0x01
#define CHAN_EXTENDED_WRITE 2 +#define CHANNEL_RESTORE_WFD 0x02
@@ -266,7 +273,7 @@ void channel_register_filter(struct ssh +#define CHANNEL_RESTORE_EFD 0x04
+
/* TCP forwarding */
#define FORWARD_DENY 0
#define FORWARD_REMOTE (1)
@@ -139,6 +149,7 @@ struct Channel {
* to a matching pre-select handler.
* this way post-select handlers are not
* accidentally called if a FD gets reused */
+ int restore_block; /* fd mask to restore blocking status */
struct sshbuf *input; /* data read from socket, to be sent over
* encrypted connection */
struct sshbuf *output; /* data received over encrypted connection for
@@ -266,7 +277,7 @@ void channel_register_filter(struct ssh *, int, channel_infilter_fn *,
void channel_register_status_confirm(struct ssh *, int, void channel_register_status_confirm(struct ssh *, int,
channel_confirm_cb *, channel_confirm_abandon_cb *, void *); channel_confirm_cb *, channel_confirm_abandon_cb *, void *);
void channel_cancel_cleanup(struct ssh *, int); void channel_cancel_cleanup(struct ssh *, int);
-int channel_close_fd(struct ssh *, int *); -int channel_close_fd(struct ssh *, int *);
+int channel_close_fd(struct ssh *, int *, int); +int channel_close_fd(struct ssh *, Channel *, int *);
void channel_send_window_changes(struct ssh *); void channel_send_window_changes(struct ssh *);
/* mux proxy support */ /* mux proxy support */
diff -up openssh-8.6p1/nchan.c.restore-nonblock openssh-8.6p1/nchan.c @@ -313,7 +324,7 @@ Channel *channel_connect_to_port(struct ssh *, const char *, u_short,
--- openssh-8.6p1/nchan.c.restore-nonblock 2021-05-10 10:55:46.990156168 +0200 char *, char *, int *, const char **);
+++ openssh-8.6p1/nchan.c 2021-05-10 11:03:46.679945863 +0200 Channel *channel_connect_to_path(struct ssh *, const char *, char *, char *);
@@ -384,7 +384,7 @@ chan_shutdown_write(struct ssh *ssh, Cha Channel *channel_connect_stdio_fwd(struct ssh *, const char*,
- u_short, int, int);
+ u_short, int, int, int);
Channel *channel_connect_by_listen_address(struct ssh *, const char *,
u_short, char *, char *);
Channel *channel_connect_by_listen_path(struct ssh *, const char *,
diff --git a/clientloop.c b/clientloop.c
index 219f0e90..bdd67686 100644
--- a/clientloop.c
+++ b/clientloop.c
@@ -1405,14 +1405,6 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg,
if (have_pty)
leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
- /* restore blocking io */
- if (!isatty(fileno(stdin)))
- unset_nonblock(fileno(stdin));
- if (!isatty(fileno(stdout)))
- unset_nonblock(fileno(stdout));
- if (!isatty(fileno(stderr)))
- unset_nonblock(fileno(stderr));
-
/*
* If there was no shell or command requested, there will be no remote
* exit status to be returned. In that case, clear error code if the
diff --git a/mux.c b/mux.c
index faf4ef1e..9454bfed 100644
--- a/mux.c
+++ b/mux.c
@@ -452,14 +452,6 @@ mux_master_process_new_session(struct ssh *ssh, u_int rid,
if (cctx->want_tty && tcgetattr(new_fd[0], &cctx->tio) == -1)
error_f("tcgetattr: %s", strerror(errno));
- /* enable nonblocking unless tty */
- if (!isatty(new_fd[0]))
- set_nonblock(new_fd[0]);
- if (!isatty(new_fd[1]))
- set_nonblock(new_fd[1]);
- if (!isatty(new_fd[2]))
- set_nonblock(new_fd[2]);
-
window = CHAN_SES_WINDOW_DEFAULT;
packetmax = CHAN_SES_PACKET_DEFAULT;
if (cctx->want_tty) {
@@ -469,7 +461,7 @@ mux_master_process_new_session(struct ssh *ssh, u_int rid,
nc = channel_new(ssh, "session", SSH_CHANNEL_OPENING,
new_fd[0], new_fd[1], new_fd[2], window, packetmax,
- CHAN_EXTENDED_WRITE, "client-session", /*nonblock*/0);
+ CHAN_EXTENDED_WRITE, "client-session", CHANNEL_NONBLOCK_STDIO);
nc->ctl_chan = c->self; /* link session -> control channel */
c->remote_id = nc->self; /* link control -> session channel */
@@ -1025,13 +1017,8 @@ mux_master_process_stdio_fwd(struct ssh *ssh, u_int rid,
}
}
- /* enable nonblocking unless tty */
- if (!isatty(new_fd[0]))
- set_nonblock(new_fd[0]);
- if (!isatty(new_fd[1]))
- set_nonblock(new_fd[1]);
-
- nc = channel_connect_stdio_fwd(ssh, chost, cport, new_fd[0], new_fd[1]);
+ nc = channel_connect_stdio_fwd(ssh, chost, cport, new_fd[0], new_fd[1],
+ CHANNEL_NONBLOCK_STDIO);
free(chost);
nc->ctl_chan = c->self; /* link session -> control channel */
diff --git a/nchan.c b/nchan.c
index 4a4494b8..7ef3a350 100644
--- a/nchan.c
+++ b/nchan.c
@@ -384,7 +384,7 @@ chan_shutdown_write(struct ssh *ssh, Channel *c)
c->istate, c->ostate, strerror(errno)); c->istate, c->ostate, strerror(errno));
} }
} else { } else {
- if (channel_close_fd(ssh, &c->wfd) < 0) { - if (channel_close_fd(ssh, &c->wfd) < 0) {
+ if (channel_close_fd(ssh, &c->wfd, c->nonblock & NEED_RESTORE_STDOUT_NONBLOCK) < 0) { + if (channel_close_fd(ssh, c, &c->wfd) < 0) {
logit_f("channel %d: close() failed for " logit_f("channel %d: close() failed for "
"fd %d [i%d o%d]: %.100s", c->self, c->wfd, "fd %d [i%d o%d]: %.100s", c->self, c->wfd,
c->istate, c->ostate, strerror(errno)); c->istate, c->ostate, strerror(errno));
@@ -412,7 +412,7 @@ chan_shutdown_read(struct ssh *ssh, Chan @@ -412,7 +412,7 @@ chan_shutdown_read(struct ssh *ssh, Channel *c)
c->istate, c->ostate, strerror(errno)); c->istate, c->ostate, strerror(errno));
} }
} else { } else {
- if (channel_close_fd(ssh, &c->rfd) < 0) { - if (channel_close_fd(ssh, &c->rfd) < 0) {
+ if (channel_close_fd(ssh, &c->rfd, c->nonblock & NEED_RESTORE_STDIN_NONBLOCK) < 0) { + if (channel_close_fd(ssh, c, &c->rfd) < 0) {
logit_f("channel %d: close() failed for " logit_f("channel %d: close() failed for "
"fd %d [i%d o%d]: %.100s", c->self, c->rfd, "fd %d [i%d o%d]: %.100s", c->self, c->rfd,
c->istate, c->ostate, strerror(errno)); c->istate, c->ostate, strerror(errno));
@@ -431,7 +431,7 @@ chan_shutdown_extended_read(struct ssh * @@ -431,7 +431,7 @@ chan_shutdown_extended_read(struct ssh *ssh, Channel *c)
debug_f("channel %d: (i%d o%d sock %d wfd %d efd %d [%s])", debug_f("channel %d: (i%d o%d sock %d wfd %d efd %d [%s])",
c->self, c->istate, c->ostate, c->sock, c->rfd, c->efd, c->self, c->istate, c->ostate, c->sock, c->rfd, c->efd,
channel_format_extended_usage(c)); channel_format_extended_usage(c));
- if (channel_close_fd(ssh, &c->efd) < 0) { - if (channel_close_fd(ssh, &c->efd) < 0) {
+ if (channel_close_fd(ssh, &c->efd, c->nonblock & NEED_RESTORE_STDERR_NONBLOCK) < 0) { + if (channel_close_fd(ssh, c, &c->efd) < 0) {
logit_f("channel %d: close() failed for " logit_f("channel %d: close() failed for "
"extended fd %d [i%d o%d]: %.100s", c->self, c->efd, "extended fd %d [i%d o%d]: %.100s", c->self, c->efd,
c->istate, c->ostate, strerror(errno)); c->istate, c->ostate, strerror(errno));
diff -up openssh-8.6p1/ssh.c.restore-nonblock openssh-8.6p1/ssh.c diff --git a/ssh.c b/ssh.c
--- openssh-8.6p1/ssh.c.restore-nonblock 2021-05-10 10:55:46.991156175 +0200 index 696dc3bc..6243db76 100644
+++ openssh-8.6p1/ssh.c 2021-05-10 11:06:28.315222828 +0200 --- a/ssh.c
@@ -2085,14 +2085,6 @@ ssh_session2_open(struct ssh *ssh) +++ b/ssh.c
@@ -1876,9 +1876,10 @@ ssh_init_stdio_forwarding(struct ssh *ssh)
if ((in = dup(STDIN_FILENO)) == -1 ||
(out = dup(STDOUT_FILENO)) == -1)
- fatal("channel_connect_stdio_fwd: dup() in/out failed");
+ fatal_f("dup() in/out failed");
if ((c = channel_connect_stdio_fwd(ssh, options.stdio_forward_host,
- options.stdio_forward_port, in, out)) == NULL)
+ options.stdio_forward_port, in, out,
+ CHANNEL_NONBLOCK_STDIO)) == NULL)
fatal_f("channel_connect_stdio_fwd failed");
channel_register_cleanup(ssh, c->self, client_cleanup_stdio_fwd, 0);
channel_register_open_confirm(ssh, c->self, ssh_stdio_confirm, NULL);
@@ -2074,14 +2075,6 @@ ssh_session2_open(struct ssh *ssh)
if (in == -1 || out == -1 || err == -1) if (in == -1 || out == -1 || err == -1)
fatal("dup() in/out/err failed"); fatal("dup() in/out/err failed");
@ -230,12 +309,12 @@ diff -up openssh-8.6p1/ssh.c.restore-nonblock openssh-8.6p1/ssh.c
window = CHAN_SES_WINDOW_DEFAULT; window = CHAN_SES_WINDOW_DEFAULT;
packetmax = CHAN_SES_PACKET_DEFAULT; packetmax = CHAN_SES_PACKET_DEFAULT;
if (tty_flag) { if (tty_flag) {
@@ -2102,7 +2094,7 @@ ssh_session2_open(struct ssh *ssh) @@ -2091,7 +2084,7 @@ ssh_session2_open(struct ssh *ssh)
c = channel_new(ssh, c = channel_new(ssh,
"session", SSH_CHANNEL_OPENING, in, out, err, "session", SSH_CHANNEL_OPENING, in, out, err,
window, packetmax, CHAN_EXTENDED_WRITE, window, packetmax, CHAN_EXTENDED_WRITE,
- "client-session", /*nonblock*/0); - "client-session", /*nonblock*/0);
+ "client-session", /*nonblock*/1); + "client-session", CHANNEL_NONBLOCK_STDIO);
debug3_f("channel_new: %d", c->self); debug3_f("channel_new: %d", c->self);

View File

@ -51,7 +51,7 @@
# Do not forget to bump pam_ssh_agent_auth release if you rewind the main package release to 1 # Do not forget to bump pam_ssh_agent_auth release if you rewind the main package release to 1
%global openssh_ver 8.6p1 %global openssh_ver 8.6p1
%global openssh_rel 4 %global openssh_rel 5
%global pam_ssh_agent_ver 0.10.4 %global pam_ssh_agent_ver 0.10.4
%global pam_ssh_agent_rel 3 %global pam_ssh_agent_rel 3
@ -660,6 +660,9 @@ test -f %{sysconfig_anaconda} && \
%endif %endif
%changelog %changelog
* Mon Jun 21 2021 Dmitry Belyavskiy <dbelyavs@redhat.com> - 8.6p1-5
- restore the blocking mode on standard output (#1942901) - upstream
* Tue May 25 2021 Timm Bäder <tbaeder@redhat.com> - 8.6p1-4 * Tue May 25 2021 Timm Bäder <tbaeder@redhat.com> - 8.6p1-4
- Use %%set_build_flags to set all builds flags - Use %%set_build_flags to set all builds flags