--- a/channels.c +++ b/channels.c @@ -1003,13 +1003,16 @@ fd_set *readset, fd_set *writeset) { + u_int limit = c->remote_window; + /* check buffer limits */ if (!c->tcpwinsz || c->dynamic_window > 0) c->tcpwinsz = channel_tcpwinsz(); - c->remote_window = MIN(c->remote_window, 2 * c->tcpwinsz); + if (c->dynamic_window) + limit = MIN(limit, 2 * c->tcpwinsz); if (c->istate == CHAN_INPUT_OPEN && - c->remote_window > 0 && - sshbuf_len(c->input) < c->remote_window && + limit > 0 && + sshbuf_len(c->input) < limit && sshbuf_check_reserve(c->input, CHAN_RBUF) == 0) FD_SET(c->rfd, readset);