]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream commit
authornaddy@openbsd.org <naddy@openbsd.org>
Fri, 5 Feb 2016 13:28:19 +0000 (13:28 +0000)
committerDamien Miller <djm@mindrot.org>
Mon, 8 Feb 2016 10:58:31 +0000 (21:58 +1100)
Only check errno if read() has returned an error.  EOF is
 not an error. This fixes a problem where the mux master would sporadically
 fail to notice that the client had exited. ok mikeb@ djm@

Upstream-ID: 3c2dadc21fac6ef64665688aac8a75fffd57ae53

channels.c

index fdd89a5a01ec250ec15d42c304bbf7c986648964..c9d2015eea39a87b2ef7dfd7d20f63d3c10afb6c 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.348 2015/10/15 23:51:40 djm Exp $ */
+/* $OpenBSD: channels.c,v 1.349 2016/02/05 13:28:19 naddy Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1896,13 +1896,13 @@ read_mux(Channel *c, u_int need)
        if (buffer_len(&c->input) < need) {
                rlen = need - buffer_len(&c->input);
                len = read(c->rfd, buf, MIN(rlen, CHAN_RBUF));
+               if (len < 0 && (errno == EINTR || errno == EAGAIN))
+                       return buffer_len(&c->input);
                if (len <= 0) {
-                       if (errno != EINTR && errno != EAGAIN) {
-                               debug2("channel %d: ctl read<=0 rfd %d len %d",
-                                   c->self, c->rfd, len);
-                               chan_read_failed(c);
-                               return 0;
-                       }
+                       debug2("channel %d: ctl read<=0 rfd %d len %d",
+                           c->self, c->rfd, len);
+                       chan_read_failed(c);
+                       return 0;
                } else
                        buffer_append(&c->input, buf, len);
        }