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 {