From 9edc2055f90e874c83ee7044d002b1aa9576fb92 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 17 May 2021 10:45:08 +0100 Subject: [PATCH] packetframe: Fuse: Do not persist EINTR or EWOULDBLOCK Fusing EINTR is particularly toxic. BufReader retries. Signed-off-by: Ian Jackson --- src/packetframe.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/packetframe.rs b/src/packetframe.rs index 2c0b3bf2..1bc227c8 100644 --- a/src/packetframe.rs +++ b/src/packetframe.rs @@ -129,7 +129,12 @@ impl Fuse { { let inner = self.get()?; let r = f(inner); - if let Err(e) = &r { + // These are often retried, or treated specially, by higher + // layers. EWOULDBLOCK can generally only occur as an actual + // error if the fd is wrongly made nonblocking. + if let Err(e) = r { + if e.kind() == ErrorKind::Interrupted || + e.kind() == ErrorKind::WouldBlock { throw!(e) } let error = Broken { msg: e.to_string(), kind: e.kind(), @@ -141,6 +146,7 @@ impl Fuse { self.inner.as_mut().map(|_|()).unwrap_err().inner = Some( inner.map_err(|e| e.error).unwrap() ); + throw!(e); } r? } -- 2.30.2