From 7c4dbc2b9b2c9d33d1847ec1777740d4c2b725fb Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 31 Jul 2026 13:53:15 +1000 Subject: [PATCH 1/3] feat: call with multiple fds Signed-off-by: Anhad Singh --- src/lib.rs | 120 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 92 insertions(+), 28 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cce27f25f9..a67ccba637 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -311,6 +311,16 @@ extern "C" { metadata: *const u64, metadata_len: usize, ) -> RawResult; + fn redox_sys_call_multiple_v0( + fds: *const usize, + fds_len: usize, + payload: *mut u8, + payload_len: usize, + flags: usize, + metadata: *const u64, + metadata_len: usize, + ) -> RawResult; + fn redox_get_socket_token_v0(fd: usize, payload: *mut u8, payload_len: usize) -> RawResult; fn redox_setns_v0(fd: usize) -> RawResult; @@ -472,6 +482,65 @@ pub mod call { use super::*; + #[cfg(feature = "redox_syscall")] + pub trait Call { + unsafe fn raw_call( + &self, + payload: *mut u8, + payload_len: usize, + flags: syscall::CallFlags, + metadata: &[u64], + ) -> Result; + } + + #[cfg(feature = "redox_syscall")] + impl Call for usize { + unsafe fn raw_call( + &self, + payload: *mut u8, + payload_len: usize, + flags: syscall::CallFlags, + metadata: &[u64], + ) -> Result { + Ok(Error::demux(unsafe { + redox_sys_call_v0( + *self, + payload, + payload_len, + flags.bits(), + metadata.as_ptr(), + metadata.len(), + ) + })?) + } + } + + #[cfg(feature = "redox_syscall")] + impl Call for &[usize] { + /// # Errors + /// + /// * `EXDEV` - The file descriptors belong to different schemes. + unsafe fn raw_call( + &self, + payload: *mut u8, + payload_len: usize, + flags: syscall::CallFlags, + metadata: &[u64], + ) -> Result { + Error::demux(unsafe { + redox_sys_call_multiple_v0( + self.as_ptr(), + self.len(), + payload, + payload_len, + flags.bits(), + metadata.as_ptr(), + metadata.len(), + ) + }) + } + } + /// flags and mode are binary compatible with libc #[inline] pub fn open(path: impl AsRef, flags: i32, mode: u16) -> Result { @@ -584,62 +653,57 @@ pub mod call { Error::demux(unsafe { redox_close_v1(raw_fd) })?; Ok(()) } + #[cfg(feature = "redox_syscall")] #[inline] - pub fn call_ro( - fd: usize, + pub fn call_ro( + fd: T, payload: &mut [u8], flags: syscall::CallFlags, metadata: &[u64], ) -> Result { - Ok(Error::demux(unsafe { - redox_sys_call_v0( - fd, + unsafe { + fd.raw_call( payload.as_mut_ptr(), payload.len(), - (flags | syscall::CallFlags::READ).bits(), - metadata.as_ptr(), - metadata.len(), + flags | syscall::CallFlags::READ, + metadata, ) - })?) + } } #[cfg(feature = "redox_syscall")] #[inline] - pub fn call_wo( - fd: usize, + pub fn call_wo( + fd: T, payload: &[u8], flags: syscall::CallFlags, metadata: &[u64], ) -> Result { - Ok(Error::demux(unsafe { - redox_sys_call_v0( - fd, - payload.as_ptr() as *mut u8, + unsafe { + fd.raw_call( + payload.as_ptr().cast_mut(), payload.len(), - (flags | syscall::CallFlags::WRITE).bits(), - metadata.as_ptr(), - metadata.len(), + flags | syscall::CallFlags::WRITE, + metadata, ) - })?) + } } #[cfg(feature = "redox_syscall")] #[inline] - pub fn call_rw( - fd: usize, + pub fn call_rw( + fd: T, payload: &mut [u8], flags: syscall::CallFlags, metadata: &[u64], ) -> Result { - Ok(Error::demux(unsafe { - redox_sys_call_v0( - fd, + unsafe { + fd.raw_call( payload.as_mut_ptr(), payload.len(), - (flags | syscall::CallFlags::READ | syscall::CallFlags::WRITE).bits(), - metadata.as_ptr(), - metadata.len(), + flags | syscall::CallFlags::READ | syscall::CallFlags::WRITE, + metadata, ) - })?) + } } #[inline] From a2110bbaa5263274597275b14bca620c50c7a7ad Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 1 Aug 2026 18:51:46 +1000 Subject: [PATCH 2/3] fix(call): verify flags in `call_{ro,wo}` Bail if `CallFlags::READ` is set in `call_wo` as that will allow the caller to mutate immutable slices. Similarly, bail if `CallFlags::WRITE` is set in `call_ro`. Signed-off-by: Anhad Singh Co-authored-by: @4lDO2 --- src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index a67ccba637..7f4842d6de 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -662,6 +662,9 @@ pub mod call { flags: syscall::CallFlags, metadata: &[u64], ) -> Result { + if flags.contains(syscall::CallFlags::WRITE) { + return Err(Error::new(syscall::EINVAL)); + } unsafe { fd.raw_call( payload.as_mut_ptr(), @@ -679,6 +682,9 @@ pub mod call { flags: syscall::CallFlags, metadata: &[u64], ) -> Result { + if flags.contains(syscall::CallFlags::READ) { + return Err(Error::new(syscall::EINVAL)); + } unsafe { fd.raw_call( payload.as_ptr().cast_mut(), From df6ecd983b32b059aeb4d353e1056afefe188f26 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Sun, 2 Aug 2026 14:29:44 +0200 Subject: [PATCH 3/3] 0.1.19 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 9a7bc84e6f..b2ddc19594 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "libredox" authors = ["4lDO2 <4lDO2@protonmail.com>"] -version = "0.1.18" +version = "0.1.19" edition = "2021" license = "MIT" description = "Redox stable ABI"