From 3b44a638f4bc806ab341caeda94464cfdcd944d6 Mon Sep 17 00:00:00 2001 From: vvsv Date: Fri, 5 Dec 2025 15:40:52 +0000 Subject: [PATCH] Zero-length reads and writes on a named pipe should succeed even if the peer is closed --- kernel/src/fs/pipe/named_pipe.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/kernel/src/fs/pipe/named_pipe.rs b/kernel/src/fs/pipe/named_pipe.rs index 0c6b4adbe..c10735845 100644 --- a/kernel/src/fs/pipe/named_pipe.rs +++ b/kernel/src/fs/pipe/named_pipe.rs @@ -88,6 +88,12 @@ impl InodeIo for NamedPipeHandle { writer: &mut VmWriter, status_flags: StatusFlags, ) -> Result { + if !writer.has_avail() { + // Even the peer endpoint has been closed, reading an empty buffer is + // still fine. + return Ok(0); + } + if status_flags.contains(StatusFlags::O_NONBLOCK) { self.try_read(writer) } else { @@ -101,6 +107,12 @@ impl InodeIo for NamedPipeHandle { reader: &mut VmReader, status_flags: StatusFlags, ) -> Result { + if !reader.has_remain() { + // Even the peer endpoint has been closed, writing an empty buffer is + // still fine. + return Ok(0); + } + if status_flags.contains(StatusFlags::O_NONBLOCK) { self.try_write(reader) } else {