From: Ian Jackson Date: Mon, 17 May 2021 09:45:08 +0000 (+0100) Subject: packetframe: Fuse: Do not persist EINTR or EWOULDBLOCK X-Git-Tag: otter-0.6.0~226 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=9edc2055f90e874c83ee7044d002b1aa9576fb92;p=otter.git packetframe: Fuse: Do not persist EINTR or EWOULDBLOCK Fusing EINTR is particularly toxic. BufReader retries. Signed-off-by: Ian Jackson --- 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? }