diff options
Diffstat (limited to 'rust/kernel/uaccess.rs')
| -rw-r--r-- | rust/kernel/uaccess.rs | 25 | 
1 files changed, 11 insertions, 14 deletions
| diff --git a/rust/kernel/uaccess.rs b/rust/kernel/uaccess.rs index e9347cff99ab..05b0b8d13b10 100644 --- a/rust/kernel/uaccess.rs +++ b/rust/kernel/uaccess.rs @@ -8,11 +8,10 @@ use crate::{      alloc::Flags,      bindings,      error::Result, +    ffi::{c_ulong, c_void},      prelude::*, -    types::{AsBytes, FromBytes}, +    transmute::{AsBytes, FromBytes},  }; -use alloc::vec::Vec; -use core::ffi::{c_ulong, c_void};  use core::mem::{size_of, MaybeUninit};  /// The type used for userspace addresses. @@ -46,15 +45,14 @@ pub type UserPtr = usize;  /// every byte in the region.  ///  /// ```no_run -/// use alloc::vec::Vec; -/// use core::ffi::c_void; +/// use kernel::ffi::c_void;  /// use kernel::error::Result;  /// use kernel::uaccess::{UserPtr, UserSlice};  ///  /// fn bytes_add_one(uptr: UserPtr, len: usize) -> Result<()> {  ///     let (read, mut write) = UserSlice::new(uptr, len).reader_writer();  /// -///     let mut buf = Vec::new(); +///     let mut buf = KVec::new();  ///     read.read_all(&mut buf, GFP_KERNEL)?;  ///  ///     for b in &mut buf { @@ -69,8 +67,7 @@ pub type UserPtr = usize;  /// Example illustrating a TOCTOU (time-of-check to time-of-use) bug.  ///  /// ```no_run -/// use alloc::vec::Vec; -/// use core::ffi::c_void; +/// use kernel::ffi::c_void;  /// use kernel::error::{code::EINVAL, Result};  /// use kernel::uaccess::{UserPtr, UserSlice};  /// @@ -78,21 +75,21 @@ pub type UserPtr = usize;  /// fn is_valid(uptr: UserPtr, len: usize) -> Result<bool> {  ///     let read = UserSlice::new(uptr, len).reader();  /// -///     let mut buf = Vec::new(); +///     let mut buf = KVec::new();  ///     read.read_all(&mut buf, GFP_KERNEL)?;  ///  ///     todo!()  /// }  ///  /// /// Returns the bytes behind this user pointer if they are valid. -/// fn get_bytes_if_valid(uptr: UserPtr, len: usize) -> Result<Vec<u8>> { +/// fn get_bytes_if_valid(uptr: UserPtr, len: usize) -> Result<KVec<u8>> {  ///     if !is_valid(uptr, len)? {  ///         return Err(EINVAL);  ///     }  ///  ///     let read = UserSlice::new(uptr, len).reader();  /// -///     let mut buf = Vec::new(); +///     let mut buf = KVec::new();  ///     read.read_all(&mut buf, GFP_KERNEL)?;  ///  ///     // THIS IS A BUG! The bytes could have changed since we checked them. @@ -130,7 +127,7 @@ impl UserSlice {      /// Reads the entirety of the user slice, appending it to the end of the provided buffer.      ///      /// Fails with [`EFAULT`] if the read happens on a bad address. -    pub fn read_all(self, buf: &mut Vec<u8>, flags: Flags) -> Result { +    pub fn read_all(self, buf: &mut KVec<u8>, flags: Flags) -> Result {          self.reader().read_all(buf, flags)      } @@ -291,9 +288,9 @@ impl UserSliceReader {      /// Reads the entirety of the user slice, appending it to the end of the provided buffer.      ///      /// Fails with [`EFAULT`] if the read happens on a bad address. -    pub fn read_all(mut self, buf: &mut Vec<u8>, flags: Flags) -> Result { +    pub fn read_all(mut self, buf: &mut KVec<u8>, flags: Flags) -> Result {          let len = self.length; -        VecExt::<u8>::reserve(buf, len, flags)?; +        buf.reserve(len, flags)?;          // The call to `try_reserve` was successful, so the spare capacity is at least `len` bytes          // long. | 
