pub struct UserRef<T: ?Sized>(/* private fields */);sgx_platform #56975)Expand description
A reference to some type in userspace memory. &UserRef<T> is equivalent
to &T in enclave memory. Access to the memory is only allowed by copying
to avoid TOCTTOU issues. After copying, code should make sure to completely
check the value before use.
It is also possible to obtain a mutable reference &mut UserRef<T>. Unlike
regular mutable references, these are not exclusive. Userspace may always
write to the backing memory at any time, so it can’t be assumed that there
the pointed-to memory is uniquely borrowed. The two different reference types
are used solely to indicate intent: a mutable reference is for writing to
user memory, an immutable reference for reading from user memory.
Implementations§
Source§impl<T> UserRef<T>
impl<T> UserRef<T>
Sourcepub unsafe fn from_ptr<'a>(ptr: *const T) -> &'a Self
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub unsafe fn from_ptr<'a>(ptr: *const T) -> &'a Self
sgx_platform #56975)Sourcepub unsafe fn from_mut_ptr<'a>(ptr: *mut T) -> &'a mut Self
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub unsafe fn from_mut_ptr<'a>(ptr: *mut T) -> &'a mut Self
sgx_platform #56975)Sourcepub fn copy_from_enclave(&mut self, val: &T)
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn copy_from_enclave(&mut self, val: &T)
sgx_platform #56975)Copies val into user memory.
§Panics
This function panics if the destination doesn’t have the same size as the source. This can happen for dynamically-sized types such as slices.
Sourcepub fn copy_to_enclave<U: ?Sized + UserSafeCopyDestination<T>>(
&self,
dest: &mut U,
)
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn copy_to_enclave<U: ?Sized + UserSafeCopyDestination<T>>( &self, dest: &mut U, )
sgx_platform #56975)Copies the value from user memory and place it into dest.
§Panics
This function panics if the destination doesn’t have the same size as the source. This can happen for dynamically-sized types such as slices.
Sourcepub fn as_raw_ptr(&self) -> *const T
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn as_raw_ptr(&self) -> *const T
sgx_platform #56975)Obtain a raw pointer from this reference.
Sourcepub fn as_raw_mut_ptr(&mut self) -> *mut T
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn as_raw_mut_ptr(&mut self) -> *mut T
sgx_platform #56975)Obtain a raw pointer from this reference.
Source§impl<T> UserRef<T>where
T: UserSafe,
impl<T> UserRef<T>where
T: UserSafe,
Sourcepub fn to_enclave(&self) -> T
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn to_enclave(&self) -> T
sgx_platform #56975)Copies the value from user memory into enclave memory.
Source§impl<T> UserRef<[T]>
impl<T> UserRef<[T]>
Sourcepub unsafe fn from_raw_parts<'a>(ptr: *const T, len: usize) -> &'a Self
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub unsafe fn from_raw_parts<'a>(ptr: *const T, len: usize) -> &'a Self
sgx_platform #56975)Creates a &UserRef<[T]> from a raw thin pointer and a slice length.
§Safety
The caller must ensure ptr points to n elements of T.
§Panics
This function panics if:
- The pointer is not aligned
- The pointer is null
- The pointed-to range does not fit in the address space
- The pointed-to range is not in user memory
Sourcepub unsafe fn from_raw_parts_mut<'a>(ptr: *mut T, len: usize) -> &'a mut Self
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub unsafe fn from_raw_parts_mut<'a>(ptr: *mut T, len: usize) -> &'a mut Self
sgx_platform #56975)Creates a &mut UserRef<[T]> from a raw thin pointer and a slice length.
See the struct documentation for the nuances regarding a
&mut UserRef<T>.
§Safety
The caller must ensure ptr points to n elements of T.
§Panics
This function panics if:
- The pointer is not aligned
- The pointer is null
- The pointed-to range does not fit in the address space
- The pointed-to range is not in user memory
Sourcepub fn as_ptr(&self) -> *const T
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn as_ptr(&self) -> *const T
sgx_platform #56975)Obtain a raw pointer to the first element of this user slice.
Sourcepub fn as_mut_ptr(&mut self) -> *mut T
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn as_mut_ptr(&mut self) -> *mut T
sgx_platform #56975)Obtain a raw pointer to the first element of this user slice.
Sourcepub fn len(&self) -> usize
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn len(&self) -> usize
sgx_platform #56975)Obtain the number of elements in this user slice.
Sourcepub fn append_to_enclave_vec(&self, dest: &mut Vec<T>)
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn append_to_enclave_vec(&self, dest: &mut Vec<T>)
sgx_platform #56975)Copies the value from user memory and appends it to dest.
Sourcepub fn to_enclave(&self) -> Vec<T>
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn to_enclave(&self) -> Vec<T>
sgx_platform #56975)Copies the value from user memory into a vector in enclave memory.
Source§impl UserRef<ByteBuffer>
impl UserRef<ByteBuffer>
Sourcepub fn copy_user_buffer(&self) -> Vec<u8> ⓘ
🔬This is a nightly-only experimental API. (sgx_platform #56975)
pub fn copy_user_buffer(&self) -> Vec<u8> ⓘ
sgx_platform #56975)Copies the user memory range pointed to by the user ByteBuffer to
enclave memory.
§Panics
This function panics if, in the user ByteBuffer:
- The pointer is null
- The pointed-to range does not fit in the address space
- The pointed-to range is not in user memory
Trait Implementations§
impl<T: CoerceUnsized<U>, U> CoerceUnsized<UserRef<U>> for UserRef<T>
Auto Trait Implementations§
impl<T> !Freeze for UserRef<T>
impl<T> !RefUnwindSafe for UserRef<T>
impl<T> !Sync for UserRef<T>
impl<T> Send for UserRef<T>
impl<T> Unpin for UserRef<T>
impl<T> UnsafeUnpin for UserRef<T>
impl<T> UnwindSafe for UserRef<T>
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> UserSafeCopyDestination<T> for T
impl<T> UserSafeCopyDestination<T> for T
Source§fn as_mut_ptr(&mut self) -> *mut T
fn as_mut_ptr(&mut self) -> *mut T
sgx_platform #56975)