diff --git a/src/scheme/mod.rs b/src/scheme/mod.rs index bdadbf04f1..ceab9aaea7 100644 --- a/src/scheme/mod.rs +++ b/src/scheme/mod.rs @@ -551,7 +551,9 @@ pub trait KernelScheme: Send + Sync + 'static { stored_flags: u32, token: &mut CleanLockToken, ) -> Result { - if offset != u64::MAX { + // u64::MAX = explicit stream write; 0 = non-positioned write from sys_write/sys_read. + // Any other offset would imply seeking on a non-seekable scheme. + if offset != u64::MAX && offset != 0 { return Err(Error::new(ESPIPE)); } self.kwrite(id, buf, flags, stored_flags, token) @@ -565,7 +567,7 @@ pub trait KernelScheme: Send + Sync + 'static { stored_flags: u32, token: &mut CleanLockToken, ) -> Result { - if offset != u64::MAX { + if offset != u64::MAX && offset != 0 { return Err(Error::new(ESPIPE)); } self.kread(id, buf, flags, stored_flags, token) diff --git a/src/syscall/fs.rs b/src/syscall/fs.rs index f1080fdd37..63bfe87508 100644 --- a/src/syscall/fs.rs +++ b/src/syscall/fs.rs @@ -832,7 +832,7 @@ pub fn sys_read(fd: FileHandle, buf: UserSliceWo, token: &mut CleanLockToken) -> let offset = if desc.internal_flags.contains(InternalFlags::POSITIONED) { desc.offset } else { - u64::MAX + 0 }; Ok(( scheme.kreadoff(desc.number, buf, offset, desc.flags, desc.flags, token)?, @@ -861,7 +861,7 @@ pub fn sys_write(fd: FileHandle, buf: UserSliceRo, token: &mut CleanLockToken) - let offset = if desc.internal_flags.contains(InternalFlags::POSITIONED) { desc.offset } else { - u64::MAX + 0 }; Ok(( scheme.kwriteoff(desc.number, buf, offset, desc.flags, desc.flags, token)?,