@@ -6,7 +6,7 @@ use super::super::mem::{is_enclave_range, is_user_range};
66use crate :: arch:: asm;
77use crate :: cell:: UnsafeCell ;
88use crate :: convert:: TryInto ;
9- use crate :: mem:: { self , ManuallyDrop } ;
9+ use crate :: mem:: { self , ManuallyDrop , MaybeUninit } ;
1010use crate :: ops:: { CoerceUnsized , Deref , DerefMut , Index , IndexMut } ;
1111use crate :: pin:: PinCoerceUnsized ;
1212use crate :: ptr:: { self , NonNull } ;
@@ -651,13 +651,29 @@ where
651651 /// the source. This can happen for dynamically-sized types such as slices.
652652 pub fn copy_to_enclave_vec ( & self , dest : & mut Vec < T > ) {
653653 if let Some ( missing) = self . len ( ) . checked_sub ( dest. capacity ( ) ) {
654- dest. reserve ( missing)
654+ dest. reserve ( missing) ;
655655 }
656656 // SAFETY: We reserve enough space above.
657657 unsafe { dest. set_len ( self . len ( ) ) } ;
658658 self . copy_to_enclave ( & mut dest[ ..] ) ;
659659 }
660660
661+ /// Copies the value from user memory and place it into `dest`.
662+ ///
663+ /// # Panics
664+ /// This function panics if the destination doesn't have the same length as
665+ /// the source.
666+ pub fn copy_to_enclave_uninit ( & self , dest : & mut [ MaybeUninit < T > ] ) {
667+ unsafe {
668+ assert_eq ! ( self . len( ) , dest. len( ) ) ;
669+ copy_from_userspace (
670+ self . 0 . get ( ) as * const [ T ] as * const u8 ,
671+ dest. as_mut_ptr ( ) as * mut u8 ,
672+ mem:: size_of_val ( dest) ,
673+ ) ;
674+ }
675+ }
676+
661677 /// Copies the value from user memory into a vector in enclave memory.
662678 pub fn to_enclave ( & self ) -> Vec < T > {
663679 let mut ret = Vec :: with_capacity ( self . len ( ) ) ;
0 commit comments