pub struct UserSliceRead { /* private fields */ }Expand description
A validated read-only reference to a user-space memory region.
Construction validates that [ptr, ptr+len) is mapped and readable
by the current process. After construction, the kernel can safely
read from this region.
Note: The mapping could theoretically be changed by another thread between validation and use. On our single-core kernel this can’t happen because we don’t preempt during a syscall handler (interrupts are re-enabled but the scheduler won’t remove our mappings). For SMP this would need additional protection (e.g. pinning pages).
Implementations§
Source§impl UserSliceRead
impl UserSliceRead
Sourcepub fn new(ptr: u64, len: usize) -> Result<Self, UserSliceError>
pub fn new(ptr: u64, len: usize) -> Result<Self, UserSliceError>
Create a new validated read-only user slice.
Fails if:
ptris nullptr + lenoverflows or crosses into kernel space- Any page in the range is not mapped or not user-accessible
Sourcepub fn read_to_vec(&self) -> Vec<u8>
pub fn read_to_vec(&self) -> Vec<u8>
Copy validated user data into a kernel-owned Vec<u8>.
Returns a vector containing a copy of the user memory.
Sourcepub fn copy_to(&self, dest: &mut [u8]) -> usize
pub fn copy_to(&self, dest: &mut [u8]) -> usize
Copy validated user data into a kernel buffer.
Copies min(self.len, dest.len()) bytes and returns how many were copied.
Sourcepub fn read_u8(&self, offset: usize) -> Result<u8, UserSliceError>
pub fn read_u8(&self, offset: usize) -> Result<u8, UserSliceError>
Read a single byte from the user slice at the given offset.
Sourcepub fn read_u64(&self, offset: usize) -> Result<u64, UserSliceError>
pub fn read_u64(&self, offset: usize) -> Result<u64, UserSliceError>
Read a u64 from the user slice at the given offset.
Auto Trait Implementations§
impl Freeze for UserSliceRead
impl RefUnwindSafe for UserSliceRead
impl Send for UserSliceRead
impl Sync for UserSliceRead
impl Unpin for UserSliceRead
impl UnsafeUnpin for UserSliceRead
impl UnwindSafe for UserSliceRead
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more