]> andersk Git - openssh.git/blobdiff - channels.c
- (stevesk) [auth1.c] fix password auth for protocol 1 when
[openssh.git] / channels.c
index 325f278f00c11c031fb17ac22d826a0779245385..95817624f8c617d9e24d9d62a6d1ab817b0f52cc 100644 (file)
@@ -39,7 +39,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: channels.c,v 1.169 2002/02/24 19:59:42 stevesk Exp $");
+RCSID("$OpenBSD: channels.c,v 1.172 2002/03/25 21:13:51 markus Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -146,7 +146,7 @@ channel_lookup(int id)
 {
        Channel *c;
 
-       if (id < 0 || id > channels_alloc) {
+       if (id < 0 || id >= channels_alloc) {
                log("channel_lookup: %d: bad id", id);
                return NULL;
        }
@@ -706,7 +706,11 @@ channel_pre_open(Channel *c, fd_set * readset, fd_set * writeset)
                if (buffer_len(&c->output) > 0) {
                        FD_SET(c->wfd, writeset);
                } else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
-                       chan_obuf_empty(c);
+                       if (CHANNEL_EFD_OUTPUT_ACTIVE(c))
+                               debug2("channel %d: obuf_empty delayed efd %d/(%d)",
+                                   c->self, c->efd, buffer_len(&c->extended));
+                       else
+                               chan_obuf_empty(c);
                }
        }
        /** XXX check close conditions, too */
@@ -714,7 +718,8 @@ channel_pre_open(Channel *c, fd_set * readset, fd_set * writeset)
                if (c->extended_usage == CHAN_EXTENDED_WRITE &&
                    buffer_len(&c->extended) > 0)
                        FD_SET(c->efd, writeset);
-               else if (c->extended_usage == CHAN_EXTENDED_READ &&
+               else if (!(c->flags & CHAN_EOF_SENT) &&
+                   c->extended_usage == CHAN_EXTENDED_READ &&
                    buffer_len(&c->extended) < c->remote_window)
                        FD_SET(c->efd, readset);
        }
@@ -1184,8 +1189,7 @@ channel_post_connecting(Channel *c, fd_set * readset, fd_set * writeset)
        socklen_t sz = sizeof(err);
 
        if (FD_ISSET(c->sock, writeset)) {
-               if (getsockopt(c->sock, SOL_SOCKET, SO_ERROR, (char *)&err,
-                   &sz) < 0) {
+               if (getsockopt(c->sock, SOL_SOCKET, SO_ERROR, &err, &sz) < 0) {
                        err = errno;
                        error("getsockopt SO_ERROR failed");
                }
@@ -1633,12 +1637,18 @@ channel_output_poll(void)
                                fatal("cannot happen: istate == INPUT_WAIT_DRAIN for proto 1.3");
                        /*
                         * input-buffer is empty and read-socket shutdown:
-                        * tell peer, that we will not send more data: send IEOF
+                        * tell peer, that we will not send more data: send IEOF.
+                        * hack for extended data: delay EOF if EFD still in use.
                         */
-                       chan_ibuf_empty(c);
+                       if (CHANNEL_EFD_INPUT_ACTIVE(c))
+                               debug2("channel %d: ibuf_empty delayed efd %d/(%d)",
+                                   c->self, c->efd, buffer_len(&c->extended));
+                       else
+                               chan_ibuf_empty(c);
                }
                /* Send extended data, i.e. stderr */
                if (compat20 &&
+                   !(c->flags & CHAN_EOF_SENT) &&
                    c->remote_window > 0 &&
                    (len = buffer_len(&c->extended)) > 0 &&
                    c->extended_usage == CHAN_EXTENDED_READ) {
@@ -1727,6 +1737,13 @@ channel_input_extended_data(int type, u_int32_t seq, void *ctxt)
                log("channel %d: ext data for non open", id);
                return;
        }
+       if (c->flags & CHAN_EOF_RCVD) {
+               if (datafellows & SSH_BUG_EXTEOF)
+                       debug("channel %d: accepting ext data after eof", id);
+               else
+                       packet_disconnect("Received extended_data after EOF "
+                           "on channel %d.", id);
+       }
        tcode = packet_get_int();
        if (c->efd == -1 ||
            c->extended_usage != CHAN_EXTENDED_WRITE ||
@@ -2036,10 +2053,10 @@ channel_setup_fwd_listener(int type, const char *listen_addr, u_short listen_por
                 * Set socket options.  We would like the socket to disappear
                 * as soon as it has been closed for whatever reason.
                 */
-               setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on));
+               setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
                linger.l_onoff = 1;
                linger.l_linger = 5;
-               setsockopt(sock, SOL_SOCKET, SO_LINGER, (void *)&linger, sizeof(linger));
+               setsockopt(sock, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger));
                debug("Local forwarding listening on %s port %s.", ntop, strport);
 
                /* Bind the socket to the address. */
This page took 0.041485 seconds and 4 git commands to generate.