]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: cap channel input buffer size at 16MB; avoids high memory use
authordjm@openbsd.org <djm@openbsd.org>
Sun, 20 Sep 2020 05:47:25 +0000 (05:47 +0000)
committerDamien Miller <djm@mindrot.org>
Sun, 20 Sep 2020 06:16:46 +0000 (16:16 +1000)
when peer advertises a large window but is slow to consume the data we send
(e.g. because of a slow network)

reported by Pierre-Yves David

fix with & ok markus@

OpenBSD-Commit-ID: 1452771f5e5e768876d3bfe2544e3866d6ade216

channels.c
channels.h

index 71c94f6cc7147def9eb572b3f5377175c6286bf4..e4917f3c92a8f4c6053ecb45c1e4654981d512af 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.401 2020/07/03 07:25:18 djm Exp $ */
+/* $OpenBSD: channels.c,v 1.402 2020/09/20 05:47:25 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -354,6 +354,7 @@ channel_new(struct ssh *ssh, char *ctype, int type, int rfd, int wfd, int efd,
        struct ssh_channels *sc = ssh->chanctxt;
        u_int i, found;
        Channel *c;
+       int r;
 
        /* Try to find a free slot where to put the new channel. */
        for (i = 0; i < sc->channels_alloc; i++) {
@@ -383,6 +384,8 @@ channel_new(struct ssh *ssh, char *ctype, int type, int rfd, int wfd, int efd,
            (c->output = sshbuf_new()) == NULL ||
            (c->extended = sshbuf_new()) == NULL)
                fatal("%s: sshbuf_new failed", __func__);
+       if ((r = sshbuf_set_max_size(c->input, CHAN_INPUT_MAX)) != 0)
+               fatal("%s: sshbuf_set_max_size: %s", __func__, ssh_err(r));
        c->ostate = CHAN_OUTPUT_OPEN;
        c->istate = CHAN_INPUT_OPEN;
        channel_register_fds(ssh, c, rfd, wfd, efd, extusage, nonblock, 0);
index ee818880e5824c18a2014e77facbec3e061a9f74..74e9b3f87110da15a8d9daf13316f32f0ea374c6 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.h,v 1.134 2020/07/05 23:59:45 djm Exp $ */
+/* $OpenBSD: channels.h,v 1.135 2020/09/20 05:47:25 djm Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -223,6 +223,9 @@ struct Channel {
 /* Read buffer size */
 #define CHAN_RBUF      (16*1024)
 
+/* Maximum channel input buffer size */
+#define CHAN_INPUT_MAX (16*1024*1024)
+
 /* Hard limit on number of channels */
 #define CHANNELS_MAX_CHANNELS  (16*1024)