check for EINTR/EAGAIN failures in the rfd fast-path;
authordjm <djm@openbsd.org>
Thu, 17 Feb 2022 10:58:27 +0000 (10:58 +0000)
committerdjm <djm@openbsd.org>
Thu, 17 Feb 2022 10:58:27 +0000 (10:58 +0000)
caught by dtucker's minix3 vm :) ok dtucker@

usr.bin/ssh/channels.c

index f5e5bae..db9d5d9 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.412 2022/01/22 00:45:31 djm Exp $ */
+/* $OpenBSD: channels.c,v 1.413 2022/02/17 10:58:27 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1931,6 +1931,8 @@ channel_handle_rfd(struct ssh *ssh, Channel *c)
                if (maxlen > avail)
                        maxlen = avail;
                if ((r = sshbuf_read(c->rfd, c->input, maxlen, NULL)) != 0) {
+                       if (errno == EINTR || errno == EAGAIN)
+                               return 1;
                        debug2("channel %d: read failed rfd %d maxlen %zu: %s",
                            c->self, c->rfd, maxlen, ssh_err(r));
                        goto rfail;