summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordjm@openbsd.org <djm@openbsd.org>2022-02-17 10:58:27 +0000
committerDamien Miller <djm@mindrot.org>2022-02-17 22:17:36 +1100
commit667fec5d4fe4406745750a32f69b5d2e1a75e94b (patch)
treede793040d3e6454121810106502c52cb0fd59243
parent41417dbda9fb55a0af49a8236e3ef9d50d862644 (diff)
upstream: check for EINTR/EAGAIN failures in the rfd fast-path; caught
by dtucker's minix3 vm :) ok dtucker@ OpenBSD-Commit-ID: 2e2c895a3e82ef347aa6694394a76a438be91361
-rw-r--r--channels.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/channels.c b/channels.c
index d662ff03..73e93c03 100644
--- a/channels.c
+++ b/channels.c
@@ -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
@@ -1951,6 +1951,9 @@ 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 || (!force &&
+ (errno == EAGAIN || errno == EWOULDBLOCK)))
+ return 1;
debug2("channel %d: read failed rfd %d maxlen %zu: %s",
c->self, c->rfd, maxlen, ssh_err(r));
goto rfail;