]> andersk Git - openssh.git/commitdiff
- markus@cvs.openbsd.org 2001/07/17 21:04:58
authormouring <mouring>
Wed, 18 Jul 2001 16:01:46 +0000 (16:01 +0000)
committermouring <mouring>
Wed, 18 Jul 2001 16:01:46 +0000 (16:01 +0000)
     [channels.c channels.h clientloop.c nchan.c serverloop.c]
     keep track of both maxfd and the size of the malloc'ed fdsets.
     update maxfd if maxfd gets closed.

ChangeLog
channels.c
channels.h
clientloop.c
nchan.c
serverloop.c

index 7c4a5b0e7d73908e49b3077dde3d3d908efca338..0dceecbbfeba772071ba46e4ba7542d74f3da902 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
    - markus@cvs.openbsd.org 2001/07/17 20:48:42                      
      [ssh-agent.c]                                                   
      update maxfd if maxfd is closed; report from jmcelroy@dtgnet.com
+   - markus@cvs.openbsd.org 2001/07/17 21:04:58                    
+     [channels.c channels.h clientloop.c nchan.c serverloop.c]     
+     keep track of both maxfd and the size of the malloc'ed fdsets.
+     update maxfd if maxfd gets closed.
 
 20010715
  - (bal) Set "BROKEN_GETADDRINFO" for darwin platform.  Reported by
index 35edff6dcc624e88fa911d3ed97134dfe80e9a13..7bf127d91571c59bae4da3e6f5e9068e208c5c58 100644 (file)
@@ -39,7 +39,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: channels.c,v 1.131 2001/07/02 22:52:56 markus Exp $");
+RCSID("$OpenBSD: channels.c,v 1.132 2001/07/17 21:04:56 markus Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -266,6 +266,37 @@ channel_new(char *ctype, int type, int rfd, int wfd, int efd,
        return c;
 }
 
+static int
+channel_find_maxfd(void)
+{
+       int i, max = 0;
+       Channel *c;
+
+       for (i = 0; i < channels_alloc; i++) {
+               c = channels[i];
+               if (c != NULL) {
+                       max = MAX(max, c->rfd);
+                       max = MAX(max, c->wfd);
+                       max = MAX(max, c->efd);
+               }
+       }
+       return max;
+}
+
+int
+channel_close_fd(int *fdp)
+{
+       int ret = 0, fd = *fdp;
+
+       if (fd != -1) {
+               ret = close(fd);
+               *fdp = -1;
+               if (fd == channel_max_fd)
+                       channel_max_fd = channel_find_maxfd();
+       }
+       return ret;
+}
+
 /* Close all channel fd/socket. */
 
 static void
@@ -274,22 +305,10 @@ channel_close_fds(Channel *c)
        debug3("channel_close_fds: channel %d: r %d w %d e %d",
            c->self, c->rfd, c->wfd, c->efd);
 
-       if (c->sock != -1) {
-               close(c->sock);
-               c->sock = -1;
-       }
-       if (c->rfd != -1) {
-               close(c->rfd);
-               c->rfd = -1;
-       }
-       if (c->wfd != -1) {
-               close(c->wfd);
-               c->wfd = -1;
-       }
-       if (c->efd != -1) {
-               close(c->efd);
-               c->efd = -1;
-       }
+       channel_close_fd(&c->sock);
+       channel_close_fd(&c->rfd);
+       channel_close_fd(&c->wfd);
+       channel_close_fd(&c->efd);
 }
 
 /* Free the channel and close its fd/socket. */
@@ -387,7 +406,7 @@ channel_stop_listening(void)
                        case SSH_CHANNEL_PORT_LISTENER:
                        case SSH_CHANNEL_RPORT_LISTENER:
                        case SSH_CHANNEL_X11_LISTENER:
-                               close(c->sock);
+                               channel_close_fd(&c->sock);
                                channel_free(c);
                                break;
                        }
@@ -842,7 +861,7 @@ channel_pre_x11_open_13(Channel *c, fd_set * readset, fd_set * writeset)
                log("X11 connection rejected because of wrong authentication.");
                buffer_clear(&c->input);
                buffer_clear(&c->output);
-               close(c->sock);
+               channel_close_fd(&c->sock);
                c->sock = -1;
                c->type = SSH_CHANNEL_CLOSED;
                packet_start(SSH_MSG_CHANNEL_CLOSE);
@@ -1333,8 +1352,7 @@ channel_handle_efd(Channel *c, fd_set * readset, fd_set * writeset)
                        if (len <= 0) {
                                debug2("channel %d: closing write-efd %d",
                                    c->self, c->efd);
-                               close(c->efd);
-                               c->efd = -1;
+                               channel_close_fd(&c->efd);
                        } else {
                                buffer_consume(&c->extended, len);
                                c->local_consumed += len;
@@ -1349,8 +1367,7 @@ channel_handle_efd(Channel *c, fd_set * readset, fd_set * writeset)
                        if (len <= 0) {
                                debug2("channel %d: closing read-efd %d",
                                    c->self, c->efd);
-                               close(c->efd);
-                               c->efd = -1;
+                               channel_close_fd(&c->efd);
                        } else {
                                buffer_append(&c->extended, buf, len);
                        }
@@ -1532,7 +1549,7 @@ channel_handler(chan_fn *ftab[], fd_set * readset, fd_set * writeset)
  */
 void
 channel_prepare_select(fd_set **readsetp, fd_set **writesetp, int *maxfdp,
-    int rekeying)
+    int *nallocp, int rekeying)
 {
        int n;
        u_int sz;
@@ -1540,15 +1557,13 @@ channel_prepare_select(fd_set **readsetp, fd_set **writesetp, int *maxfdp,
        n = MAX(*maxfdp, channel_max_fd);
 
        sz = howmany(n+1, NFDBITS) * sizeof(fd_mask);
-       if (*readsetp == NULL || n > *maxfdp) {
-               if (*readsetp)
-                       xfree(*readsetp);
-               if (*writesetp)
-                       xfree(*writesetp);
-               *readsetp = xmalloc(sz);
-               *writesetp = xmalloc(sz);
-               *maxfdp = n;
+       /* perhaps check sz < nalloc/2 and shrink? */
+       if (*readsetp == NULL || sz > *nallocp) {
+               *readsetp = xrealloc(*readsetp, sz);
+               *writesetp = xrealloc(*writesetp, sz);
+               *nallocp = sz;
        }
+       *maxfdp = n;
        memset(*readsetp, 0, sz);
        memset(*writesetp, 0, sz);
 
index e4146b593f4747f1e791dfebb0624ff285e733d1..2ee1496c789a0a311123719c4bcedd7cd33b8431 100644 (file)
@@ -32,7 +32,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-/* RCSID("$OpenBSD: channels.h,v 1.44 2001/07/02 22:52:57 markus Exp $"); */
+/* RCSID("$OpenBSD: channels.h,v 1.45 2001/07/17 21:04:57 markus Exp $"); */
 
 #ifndef CHANNEL_H
 #define CHANNEL_H
@@ -152,6 +152,7 @@ void         channel_register_callback(int, int mtype, channel_callback_fn *, void *);
 void    channel_register_cleanup(int, channel_callback_fn *);
 void    channel_register_filter(int, channel_filter_fn *);
 void    channel_cancel_cleanup(int);
+int     channel_close_fd(int *);
 
 /* protocol handler */
 
@@ -169,7 +170,7 @@ void         channel_input_window_adjust(int, int, void *);
 
 /* file descriptor handling (read/write) */
 
-void    channel_prepare_select(fd_set **, fd_set **, int *, int);
+void    channel_prepare_select(fd_set **, fd_set **, int *, int*, int);
 void     channel_after_select(fd_set *, fd_set *);
 void     channel_output_poll(void);
 
index 83b2d4d8e3a9be02f631b57ffdb97e8c175424aa..41aff8354e97f948ca0919d213c721bc5aaea109 100644 (file)
@@ -59,7 +59,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: clientloop.c,v 1.80 2001/06/30 18:08:40 stevesk Exp $");
+RCSID("$OpenBSD: clientloop.c,v 1.81 2001/07/17 21:04:57 markus Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -318,10 +318,10 @@ client_check_window_change(void)
 
 static void
 client_wait_until_can_do_something(fd_set **readsetp, fd_set **writesetp,
-    int *maxfdp, int rekeying)
+    int *maxfdp, int *nallocp, int rekeying)
 {
        /* Add any selections by the channel mechanism. */
-       channel_prepare_select(readsetp, writesetp, maxfdp, rekeying);
+       channel_prepare_select(readsetp, writesetp, maxfdp, nallocp, rekeying);
 
        if (!compat20) {
                /* Read from the connection, unless our buffers are full. */
@@ -770,7 +770,7 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
 {
        fd_set *readset = NULL, *writeset = NULL;
        double start_time, total_time;
-       int max_fd = 0, len, rekeying = 0;
+       int max_fd = 0, max_fd2 = 0, len, rekeying = 0, nalloc = 0;
        char buf[100];
 
        debug("Entering interactive session.");
@@ -877,8 +877,9 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
                 * Wait until we have something to do (something becomes
                 * available on one of the descriptors).
                 */
+               max_fd2 = max_fd;
                client_wait_until_can_do_something(&readset, &writeset,
-                   &max_fd, rekeying);
+                   &max_fd2, &nalloc, rekeying);
 
                if (quit_pending)
                        break;
diff --git a/nchan.c b/nchan.c
index 8e1be2d36b9c3b93a58554493954b37292360132..43d80bf251f2bb64f49e913d3e05b81738718c38 100644 (file)
--- a/nchan.c
+++ b/nchan.c
@@ -23,7 +23,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: nchan.c,v 1.30 2001/06/25 08:25:38 markus Exp $");
+RCSID("$OpenBSD: nchan.c,v 1.31 2001/07/17 21:04:57 markus Exp $");
 
 #include "ssh1.h"
 #include "ssh2.h"
@@ -518,11 +518,10 @@ chan_shutdown_write(Channel *c)
                            "shutdown() failed for fd%d: %.100s",
                            c->self, c->sock, strerror(errno));
        } else {
-               if (close(c->wfd) < 0)
+               if (channel_close_fd(&c->wfd) < 0)
                        log("channel %d: chan_shutdown_write: "
                            "close() failed for fd%d: %.100s",
                            c->self, c->wfd, strerror(errno));
-               c->wfd = -1;
        }
 }
 static void
@@ -544,10 +543,9 @@ chan_shutdown_read(Channel *c)
                            c->self, c->sock, c->istate, c->ostate,
                             strerror(errno));
        } else {
-               if (close(c->rfd) < 0)
+               if (channel_close_fd(&c->rfd) < 0)
                        log("channel %d: chan_shutdown_read: "
                            "close() failed for fd%d: %.100s",
                            c->self, c->rfd, strerror(errno));
-               c->rfd = -1;
        }
 }
index f826c6cb2dbba90e07818dc2a467ade4d88bc7c2..d9791274ce973b13fc7335afce08bf5ca03fb070 100644 (file)
@@ -35,7 +35,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: serverloop.c,v 1.75 2001/07/15 16:17:08 markus Exp $");
+RCSID("$OpenBSD: serverloop.c,v 1.76 2001/07/17 21:04:58 markus Exp $");
 
 #include "xmalloc.h"
 #include "packet.h"
@@ -169,7 +169,7 @@ make_packets_from_stdout_data(void)
  */
 static void
 wait_until_can_do_something(fd_set **readsetp, fd_set **writesetp, int *maxfdp,
-    u_int max_time_milliseconds)
+    int *nallocp, u_int max_time_milliseconds)
 {
        struct timeval tv, *tvp;
        int ret;
@@ -193,7 +193,7 @@ wait_until_can_do_something(fd_set **readsetp, fd_set **writesetp, int *maxfdp,
 retry_select:
 
        /* Allocate and update select() masks for channel descriptors. */
-       channel_prepare_select(readsetp, writesetp, maxfdp, 0);
+       channel_prepare_select(readsetp, writesetp, maxfdp, nallocp, 0);
 
        if (compat20) {
                /* wrong: bad condition XXX */
@@ -435,7 +435,7 @@ void
 server_loop(pid_t pid, int fdin_arg, int fdout_arg, int fderr_arg)
 {
        fd_set *readset = NULL, *writeset = NULL;
-       int max_fd;
+       int max_fd = 0, nalloc = 0;
        int wait_status;        /* Status returned by wait(). */
        pid_t wait_pid;         /* pid returned by wait(). */
        int waiting_termination = 0;    /* Have displayed waiting close message. */
@@ -476,12 +476,14 @@ server_loop(pid_t pid, int fdin_arg, int fdout_arg, int fderr_arg)
        else
                buffer_high = 64 * 1024;
 
+#if 0
        /* Initialize max_fd to the maximum of the known file descriptors. */
-       max_fd = MAX(fdin, fdout);
+       max_fd = MAX(connection_in, connection_out);
+       max_fd = MAX(max_fd, fdin);
+       max_fd = MAX(max_fd, fdout);
        if (fderr != -1)
                max_fd = MAX(max_fd, fderr);
-       max_fd = MAX(max_fd, connection_in);
-       max_fd = MAX(max_fd, connection_out);
+#endif
 
        /* Initialize Initialize buffers. */
        buffer_init(&stdin_buffer);
@@ -567,9 +569,14 @@ server_loop(pid_t pid, int fdin_arg, int fdout_arg, int fderr_arg)
                                xfree(cp);
                        }
                }
+               max_fd = MAX(connection_in, connection_out);
+               max_fd = MAX(max_fd, fdin);
+               max_fd = MAX(max_fd, fdout);
+               max_fd = MAX(max_fd, fderr);
+
                /* Sleep in select() until we can do something. */
                wait_until_can_do_something(&readset, &writeset, &max_fd,
-                   max_time_milliseconds);
+                   &nalloc, max_time_milliseconds);
 
                /* Process any channel events. */
                channel_after_select(readset, writeset);
@@ -662,7 +669,7 @@ void
 server_loop2(Authctxt *authctxt)
 {
        fd_set *readset = NULL, *writeset = NULL;
-       int rekeying = 0, max_fd, status;
+       int rekeying = 0, max_fd, status, nalloc = 0;
        pid_t pid;
 
        debug("Entering interactive session for SSH2.");
@@ -685,7 +692,7 @@ server_loop2(Authctxt *authctxt)
                if (!rekeying && packet_not_very_much_data_to_write())
                        channel_output_poll();
                wait_until_can_do_something(&readset, &writeset, &max_fd,
-                   rekeying);
+                   &nalloc, 0);
                if (child_terminated) {
                        while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
                                session_close_by_pid(pid, status);
This page took 0.207143 seconds and 5 git commands to generate.